web-dev-qa-db-ja.com

バッファオーバーフローに対して画像解析ライブラリをどのように保護しますか?

画像解析によるバッファオーバーフローの新機能。どのようにして画像を解析する安全なライブラリを設計し、その中にセキュリティの脆弱性がないことを確認できますか?画像解析ライブラリはバッファオーバーフローに対して脆弱であることは一般的な知識なので、画像解析ライブラリをバッファオーバーフローから保護する方法を具体的に説明していただければ幸いです。

1
boomselector

画像解析ライブラリに限定されない明らかなことがいくつかあります。

  • 入力が整形式であると想定しないでくださいですが、実際に確認してください。意図的に不正な形式の入力を考慮して設計されていないものの、疑わしい発信元からの入力を処理するために使用されているのは、実際には画像またはビデオライブラリの一般的な問題です。
  • 安全なプログラミング言語を使用するこれは、設計上、バッファオーバーフローの影響を受けないか、少なくとも発生する可能性が非常に低くなります。つまり、配列の境界から書き出すことができず、空きメモリや同様のメモリ管理の問題を2倍にできない言語を使用します。上位レベルのほとんどの言語には、この種の問題はありませんが、パフォーマンスに影響を与える可能性があります。しかし、Rustのような低レベルの言語もあり、メモリの安全性と高性能の両方を同時に提供します。
  • プログラミングエラーの影響を制限するスタック(カナリア)を保護し、スタックからのコード実行を防止し、アプリケーションの周りにある種のサンドボックスを提供するコンパイラ固有またはシステム全体のメカニズムを使用する。
4
Steffen Ullrich

Steffenの答えから1点拡大します。信頼できない入力を消費し、エクスプロイトリスクと見なされるコードがある場合は常に-信頼できないソースからのファイルを消費するイメージライブラリなど-そのコードのサンドボックス化を検討する必要があります。これを行うにはいくつかの方法があり、言語、OS、CPUアーキテクチャなどによって異なりますが、最も一般的な方法をいくつか次に示します。

  • 特別な低特権のユーザーアカウントとしてコードを実行します。このユーザーアカウントは、ジョブの実行に必要なもの以外には、読み取りまたは書き込みアクセス権がありません。最近のすべての汎用オペレーティングシステムがこれをサポートしていますが、そのようなユーザーを十分に制限されたアクセスでセットアップし、ファイルなどを安全に引き渡すのは簡単ではありません。また、他のほとんどのオプションよりも、このような手法によって公開される攻撃面が多くなります。
  • 他のプログラムとの制御された相互作用を可能にしながら、有害な動作を防止するOS提供の低い特権のサンドボックスでコードを実行します。これは非常にOS固有のものですが、最近のほとんどのOSは何らかの形でサポートしています。 Windows 8以降でAppContainers(「モダン」Windowsストアアプリで使用されるものなど)を使用できます。OSXでアプリサンドボックスを使用できます。Linuxやその他のUnixライクなOSでコンテナーを使用できます。jailを使用できます。これは通常、* BSDなどでサポートされます。これは、最も単純で最もサポートされているオプションの1つであり(Windows、Mac、Android、およびiOS開発ツールはすべて、開発者の労力をほとんど必要とせずに、このようなサンドボックスの作成をサポートします)、優れたパフォーマンスを発揮しますが、プラットフォーム固有です。 Windows 7などでは機能しません。
  • SELinuxやAppArmor(どちらもLinuxの場合)、chroot(ほとんどのUnixライクなOSで利用可能)、CreateRestrictedToken(Windows API)に加えて、次のような他のWindowsセキュリティ機能などのアクセス制限機能を使用して、このようなサンドボックスを手動で作成することもできます。必須の完全性管理。このアプローチは、真に安全に行うには多くの作業であり、依然としてプラットフォーム固有ですが、単にアクセスが制限されたユーザーアカウントを使用するよりもセキュリティが強化された非常に幅広いオペレーティングシステムで機能するように設定できます。 。これは、さまざまなシステムで多くのセキュリティを必要とするが、ChromeやIE7 +など)のように優れたパフォーマンスを必要とする一部のアプリがサンドボックス化される方法です。
  • ホストへのアクセスが最小限でリソースが制限されている仮想マシンでコードを実行します。コードがVMを完全に引き継いでも、ホストはそのインスタンスを強制終了し、クリーンなイメージから新しいインスタンスを開始できます。これは、コンピューティングリソースは比較的高価ですが、セットアップが非常に簡単で、非常に優れたセキュリティを提供します。
  • 言語レベルのサンドボックスを利用します。たとえば、Javaランタイムでは、コードで実行できることを制限する「SecurityManager」を作成できます。これにより、Javaアプレットサンドボックスが実装されます。 Javaアプレットのセキュリティの歴史を知っている人なら誰でもわかるように、実行されているコードがアクティブに悪意のある場合-システムを攻撃する方法が多すぎる場合は安全ではありませんすでにメモリセーフなJava言語で記述された悪意のないコードである場合、それは、コードが次のようなことを引き起こす可能性がある論理エラーから保護するためのまともな追加の多層防御です。攻撃者が選択した場所にファイルを書き込む。
3
CBHacking