最近、Cosmopolitan C標準ライブラリおよびRedbeanプラットフォームの作者が、Linux向けにpledge()分離メカニズムを実装したことを発表しました。
元々はOpenBSDプロジェクトによって開発されたpledgeは、アプリケーションが未使用のシステムコールにアクセスすることを選択的に禁止できるツールです(アプリケーション用のシステムコールのホワイトリストを作成し、それ以外のコールを禁止します)。Linuxで利用可能なseccompなどのシステムコールアクセス制御メカニズムとは異なり、pledgeは可能な限りユーザーフレンドリーになるよう最初から設計されています。
systraceメカニズムを使用してOpenBSDベース環境でアプリケーションを分離するというイニシアチブの失敗は、個々のシステムコールのレベルでの分離が複雑すぎて時間がかかることを示しました。
あるいは、詳細に立ち入ったり、準備済みのアクセス クラスを操作したりすることなく、分離ルールを作成できるプレッジが提案された。
たとえば、提供されるクラスは、stdio(入力/出力)、rpath(読み取り専用ファイル)、wpath(書き込みファイル)、cpath(ファイルの作成)、tmppath(一時ファイルの処理)、inet(ソケットネットワーク)、unix(unixソケット)です。 )、dns(DNS解決)、getpw(ユーザーデータベースへの読み取りアクセス)、ioctl(ioctl呼び出し)、proc(プロセス制御)、exec(起動プロセス)、およびid(許可制御)。
システムコールを操作するためのルールは、許可されたシステムコールクラスのリストと、アクセスが許可されているファイルパスの配列を含む注釈の形式で指定されます。変更されたアプリケーションをコンパイルして実行すると、カーネルが指定されたルールへの準拠を監視するタスクを引き継ぎます。
これとは別に、FreeBSDの誓約の実装が開発されています。これは、コードを変更せずにアプリケーションを分離する機能によって区別されます。一方、OpenBSDでは、誓約の呼び出しは、基本環境との緊密な統合とコードへの注釈の追加を目的としています。それぞれの。
誓約は、上司がLinuxのようなものを使うべきだと言ったときに私たち全員が切望する禁断の果実のようなものです。 なぜそれが重要なのですか? これは、pledge()が実際にセキュリティを理解できるようにするためです。 Linuxには、単なる人間が理解できるセキュリティの層が実際にあったことはありません。
Linux 版 pledge ポートの開発者は FreeBSD のやり方に倣い、コードを変更する代わりに、アプリケーション コードを変更せずに制限を適用できる pledge.com の追加ユーティリティを用意しました。たとえば、システム コール クラス stdio、rpath、inet、threadstdio のみにアクセスして curl ユーティリティを実行するには、`./pledge.com -p 'stdio rpath inet thread' curl http://example.com` を実行するだけです。
このユーティリティはRHEL6以降のすべてのLinuxディストリビューションで動作し、root権限は不要です。さらに、汎用ライブラリに基づいて、C言語プログラムコードにおける制限を管理するためのAPIが提供されており、特定のアプリケーション機能へのアクセスを選択的に制限するためのエンクレーブの作成などが可能になります。
これを試した開発者は過去に数人います。 これらのプロジェクトのほとんどは完了していなかったため、名前を付けるつもりはありません。 SECOMPに関しては、オンラインチュートリアルではシステムコールをホワイトリストに登録する方法しか説明されていないため、ほとんどの人は引数をフィルタリングする方法を理解する前に興味を失います。 前進したプロジェクトには、setuid / setgid/stickyビットの変更を許可するなどの見落としもありました。 したがって、現在の代替手段は使用しないでください。 この取り組みにより、これまで以上にpledge()に近づくことができると思います。
実装にはカーネルの変更は必要ありません。ユーティリティの制約はSECCOMPBPFルールに変換され、Linuxのネイティブシステムコール分離メカニズムを使用して処理されます。 たとえば、promise( "stdio rpath"、0)を呼び出すと、BPFフィルターに変換されます
最後に、さらに詳しく知りたい場合は、以下のリンクから詳細をご確認いただけます。