BSD界隈四方山話

第35回OpenBSD pledge(2)システムコール、5.9で正式登場

pledge(2)システムコール、OpenBSD 5.9で登場

OpenBSDのTheo de Raadt氏がopenbsd-techメーリングリストに投函したanother report about pledgeにおいて、現在開発が進められているpledge(2)システムコールの進捗状況が報告されました。⁠OpenBSD 5.9」のリリースへ向けたフリーズがはじまる前のこの段階での報告は、そのままOpenBSD 5.9に反映されることになると見られます。

pledge(2)システムコールは現在のリリースバージョンであるOpenBSD 5.8においてtame(2)という名前のシステムコールとして導入されました。OpenBSD 5.8で導入されたのはシステムコールの基本的な実装で、ベースシステムのコマンドにはこのシステムコールは適用されていませんでした。

現在のところ、OpenBSD 5.9のベースシステム(/bin /sbin /usr/bin /usr/sbin /usr/libexec /usr/games)には652個のELFバイナリファイルが存在し、うち451個がすでにpledge(2)システムコールを使っているとのことです。2015年11月の時点では368個のELFバイナリファイルにpledge(2)システムコールが適用されているという報告がありましたので、この2ヶ月間の間に83個のコマンドに新しくpledge(2)システムコールが適用されたことになります。

今回の進捗報告があった段階でまだpledge(2)システムコールが適用されていないELFバイナリファイルの数は201個。うち、47個はpledge(2)システムコールを適用する意味がないと判断されており、残り154個が今後pledge(2)システムコールが適用されるELFバイナリファイルということになります。

pledge(2)システムコールでセキュリティ強化

OpenBSD pledge(2)システムコールはFreeBSD Capsicum(cap_enter(2)システムコール、cap_fcntls_limit(2)システムコール、cap_ioctls_limit(2)システムコール、cap_rights_limit(2)システムコール)によく似ています。プロセスの機能を制限するというシステムコールで、pledge(2)システムコールを実行するとそのプロセスはそれ以降に利用できる機能(アクセスできるリソース)が制限されるようになります。

FreeBSD Capsicumはケーパビリティと呼ばれるリソース保護モデルの実装系のひとつです。ほかの実装系と比較して既存のPOSIX実装系との相性がよく、数行のコードの追加で機能を適用できるといった特徴があります。FreeBSDではベースシステムのいくつかのコマンドと、サードパーティ製ソフトウェアのいくつかにCapsicumを適用しています。

OpenBSD pledge(2)システムコールはシステムコール的にはCapsicumによく似ています。Capsicumよりもさらに簡単に利用できるようになっており、pledge(2)システムコールの引数に制限内容を指定するだけで機能が制限できるという特徴があります。

OpenBSD 5.9ではpaths指定が使えないという制限あり

Theo de Raadt氏はanother report about pledgeの中で、pledge(2)システムコールの2つ目の引数であるpathsの機能を無効にすると説明しています。この引数はchroot(2)と似たような機能を提供するものですが、OpenBSD 5.9ではこの機能は先送りになるとのことです。

現在、ベースシステムのコマンドにpledge(2)を適用していくこと、それぞれのコマンドに適した規制を適用すること、コマンドに必要となる新しい規制(promises)を実装することなどに開発資源を集中しており、pathsの実装まで手が回らないとしています。

pledge(2)システムコールインターフェース
int
pledge(const char *promises, const char *paths[]);

pledge(2)システムコールはセキュリティを強化する機能であるため、カーネル全域をコードレビューしてバグがないことを確認する必要があります。pathsを実装してそのコードレビューまでするのでは次のリリースまでに間に合わないと判断したようです。

pledge(2)システムコールをChromiumに適用

pledge(2)システムコールやCapsicumは複数のプロセスにfork(2)して実行されるタイプのアプリケーションでとくにその優位性を発揮します。こうした構造を持ち、世界中でもっとも多く使われているとみられるソフトウェアがChromium(Chrome)です。

Chromiumはマルチプロセスアーキテクチャといって、レンダリング、プラグイン、ユーティリティといったように単一のプロセスではなく、複数のプロセスとして実行されます。それぞれのプロセスでpledge(2)システムコールを実行すれば、それぞれに必要となる機能だけを利用できるようにして、それ以外のリソースへのアクセスを禁止するといったことができます(その分セキュリティが向上すると言われています⁠⁠。

FreeBSDはすでにChromiumにCapsicumを適用しています。OpenBSDもTheo de Raadt氏から進捗報告が出る前にChromiumにpledge(2)システムコールを適用するパッチがportsにコミットされましたChromium: now with OpenBSD pledge(2)⁠。最初のコミットではpledge(2)にpathsの指定がありましたが、Theo de Raadt氏からpathsのサポート延長があったあとで削除されましたrobert@cvs.openbsd.org 2016/01/08 08:18:09⁠。

OpenBSD 6.0でフルサポートへ

次のリリースバージョンとなるOpenBSD 5.9では、いくつかのコマンドはpledge(2)システムコールが適用されず、第2引数であるpathsの指定も機能しません。さらに次のリリースバージョンとなるOpenBSD 6.0では、さらに多くのコマンドがpledge(2)システムコールを利用するようになり、pathsの指定も機能するようになるものとみられます。

高い効果が期待できるコマンドやアプリケーションのだけCpasicumを適用しているFreeBSDと異なり、OpenBSDでは基本的にすべてのコマンドでこの機能を使うといった姿勢を見せています。OpenBSDはOpenBSD 5.9およびOpenBSD 6.0からはさらにデフォルトでの安全性を高めることになりそうです。

おすすめ記事

記事・ニュース一覧