OpenBSDの革新
(openbsd.org)OpenBSDプロジェクトは、さまざまなソフトウェアやアイデアを開発・保守している。おおまかな導入順に整理したもの。
概念 (Concepts)
- IPSec(4): OpenBSDは、IPSecスタックを提供した最初のフリーなオペレーティングシステムだった。1997年2月20日に導入
- INET6(4): OpenBSD 2.7でIPv6を完全統合。1999年1月6日から開発開始、同年6月6日の最初のハッカソンでほぼ完全に動作する状態に到達
- 権限分離 (Privilege Separation): 2002年3月、OpenSSHで初めて実装。その後、bgpd(8)、dhclient(8)、smtpd(8)、tmux(1)など多くのプログラムに適用
- 権限剥奪 (Privilege Revocation): 特定のリソースを維持しつつ権限を下げる方式を適用。例: ping(8), traceroute(8)
- スタックプロテクタ (Stack Protector): 2001年から開発された "propolice" ベース。OpenBSD 3.3でデフォルト有効化
- W^X (Write XOR Execute): OpenBSD 3.3で初めて適用。OpenBSD 6.0からデフォルトで厳格に強制
- GOTおよびPLT保護: OpenBSD 3.3でGOT(グローバルオフセットテーブル)およびPLT(プロシージャリンクテーブル)を保護するようld.soを改善
- ASLR (Address Space Layout Randomization): OpenBSD 3.4が初めてデフォルト有効化
- gcc-local(1) の解析および検査: OpenBSD 3.4で初導入
- malloc(3) のセキュリティ強化: メモリ割り当て時のランダム化と遅延解放を適用。OpenBSD 4.4で再実装
- 位置独立実行ファイル (PIE): OpenBSD 5.3で初めてデフォルト有効化。7つのハードウェアプラットフォーム
- 乱数ベースのメモリ初期化: OpenBSD 5.3でELF .openbsd.randomdataセクションを追加
- 共有オブジェクトごとのスタックプロテクタ: OpenBSD 5.3で各共有オブジェクトに個別のスタックプロテクタCookieを適用
- Static-PIE: /bin、/sbinおよびRAMディスクで位置独立な静的バイナリをサポート。OpenBSD 5.7で導入
- SROP攻撃緩和: OpenBSD 6.0でデフォルト有効化
- ライブラリ読み込み順序のランダム化: OpenBSD 6.0および6.2でデフォルト有効化
- マルチスレッド環境でのW^X安全性のためのlazy-binding改善: OpenBSD 5.9で導入
- メモリレイアウト強化: OpenBSD 6.1で全プログラムとライブラリに適用
- fork+exec方式の使用: 権限分離されたプログラムでアドレス空間保護を強化
- trapsleds: ROP(リターン指向プログラミング)攻撃緩和を目的としたNOP変換手法を適用
- カーネルのブート時再リンク: 起動のたびにカーネル内部レイアウトをランダム化
- i386/amd64命令シーケンスのセキュリティ強化: ROP攻撃を困難にするための改善
- MAP_STACKオプション追加: ROP攻撃でスタック以外のメモリを悪用することを防止
- RETGUARD: 従来のスタックプロテクタより強力な保護メカニズムとしてOpenBSD 6.4から導入
- MAP_CONCEALオプション追加: 機密情報がコアダンプから漏えいしないよう防止
- PROT_WRITEメモリでのシステムコール遮断: OpenBSD 6.5で導入
- システムコール位置の固定: 特定の位置でのみシステムコールを可能にするよう制限
- アドレス空間保護の強化: mmap(2)、mprotect(2) などによるメモリ変更を制限
- sshdのブート時再リンク: OpenBSD 7.2で導入
- 非可読コード (xonly) サポート: 実行可能メモリを読み取れないように制限
- pinsyscalls(2) システムコール保護: システムコール位置を事前登録して保護
- 間接分岐ターゲット保護 (BTI, IBT): ハードウェアベースのセキュリティ機能を適用
- -fret-clean機能追加: 戻り値がスタックに残るのを防いで情報漏えいを遮断。現在はamd64のみ適用
関数 (Functions)
- issetugid(2): OpenBSD 2.0で導入された関数で、プロセスが実行中に設定されたユーザーIDまたはグループIDを確認する機能を提供
- arc4random(3): 乱数生成関数で、OpenBSD 2.1で追加
- bcrypt(3): パスワードハッシュ化のための関数。OpenBSD 2.1で初導入
- strlcpy(3), strlcat(3): 安全な文字列コピーおよび連結のための関数。OpenBSD 2.4で導入
- strtonum(3): 文字列を数値に変換しつつエラーを防ぐ関数。OpenBSD 3.6で導入
- imsg: メッセージ伝達APIで、さまざまなデーモンで使用。OpenBSD 4.8でlibutilに追加
- timingsafe_bcmp(3): 一定の実行時間を保証するバイト比較関数。OpenBSD 4.9で導入
- explicit_bzero(3): メモリを安全に消去する関数。OpenBSD 5.5で追加
- ohash: ハッシュテーブル実装。OpenBSD 5.6でlibutilに含まれる
- asr: 代替DNSリゾルバ。OpenBSD 5.6で有効化
- reallocarray(3): メモリ再割り当て時のオーバーフローを防ぐ関数。OpenBSD 5.6で追加
- getentropy(2): セキュアな乱数を提供する関数。OpenBSD 5.6で導入
- sendsyslog(2): カーネルからsyslogメッセージを送る関数。OpenBSD 5.6で追加
- timingsafe_memcmp(3): 一定の実行時間を保証するメモリ比較関数。OpenBSD 5.6で導入
- pledge(2): システムコールを制限してセキュリティを高める関数。OpenBSD 5.9で追加
- getpwnam_shadow(3), getpwuid_shadow(3): セキュリティ強化のためにシャドウパスワードデータを検索する関数。OpenBSD 5.9で導入
- recallocarray(3): メモリサイズ変更時に既存データを0で埋める関数。OpenBSD 6.1で追加
- freezero(3): メモリを解放しつつ0で埋める関数。OpenBSD 6.2で導入
- unveil(2): ファイルシステムアクセスを制限する関数。OpenBSD 6.4で追加
- malloc_conceal(3), calloc_conceal(3): メモリ割り当て時に機密データを保護する機能を提供。OpenBSD 6.5で追加
- ober: ASN.1基本符号化規則API。OpenBSD 6.6でlibutilへ移動
プログラムとサブシステム (Programs and Subsystems)
- YP関連ユーティリティ: ypbind(8), ypset(8), ypcat(1), ypmatch(1), ypwhich(1)、libcサポートを追加。NetBSD 0.9で最初に配布
- ypserv(8): OpenBSD 2.0で導入されたYPサーバー
- mopd(8): MOP(Maintenance Operations Protocol)対応デーモン。OpenBSD 2.0で追加
- AnonCVS: OpenBSDコードリポジトリへ匿名でアクセスできるよう設計されたシステム
- aucat(1): オーディオサーバー関連ユーティリティ。OpenBSD 2.1で追加
- OpenSSH: SSHベースのセキュア通信ツール。OpenBSD 2.6で導入
- mg(1): 軽量テキストエディタ。OpenBSD 2.7で収録
- m4(1): マクロプロセッサ。OpenBSD 2.7以降に拡張・保守
- pf(4), pfctl(8), pflogd(8), authpf(8), ftp-proxy(8): パケットフィルタリングファイアウォール。OpenBSD 3.0で追加
- systrace(4), systrace(1): システムコール監視ツール。OpenBSD 3.2で追加されたが、OpenBSD 5.9以降は pledge(2) に置き換えられた
- spamd(8): スパムフィルタリング用デーモン。OpenBSD 3.3で導入
- dc(1), bc(1): 電卓ユーティリティ。OpenBSD 3.5で追加
- sensorsd(8): ハードウェアセンサー監視ツール。OpenBSD 3.5で収録
- pkg_add(1): パッケージ管理ユーティリティ。OpenBSD 3.5で導入
- carp(4): フェイルオーバーのためのネットワークインターフェースプロトコル。OpenBSD 3.5で追加
- OpenBGPD: BGPルーティングデーモン。OpenBSD 3.5で導入
- dhclient(8), dhcpd(8): DHCPクライアントおよびサーバー。OpenBSD 3.5〜3.6で追加
- hotplugd(8): ホットプラグイベント処理デーモン。OpenBSD 3.6で追加
- OpenNTPD: NTP(Network Time Protocol)デーモン。OpenBSD 3.6で追加
- dpb(1): 分散パッケージビルドシステム。OpenBSD 3.6で導入
- ospfd(8), ospfctl(8), ospf6d(8): OSPF(Open Shortest Path First)ルーティングデーモン。OpenBSD 3.7〜4.2で導入
- ifstated(8): インターフェース状態管理ツール。OpenBSD 3.8で追加
- bioctl(8): ブロックデバイスおよびRAID管理ツール。OpenBSD 3.8で収録
- hostapd(8): 無線アクセスポイント管理ツール。OpenBSD 3.8で導入
- watchdogd(8): システム安定性を確保する監視タイマー。OpenBSD 3.8で追加
- sdiff(1): ファイル比較ユーティリティ。OpenBSD 3.9で導入
- dvmrpd(8), dvmrpctl(8): DVMRP(Distance Vector Multicast Routing Protocol)対応。OpenBSD 4.0で追加
- ripd(8), ripctl(8): RIP(Routing Information Protocol)対応。OpenBSD 4.1で収録
- pkg-config(1): パッケージ設定ツール。OpenBSD 4.1で導入
- relayd(8), relayctl(8): ネットワークトラフィック中継ツール。OpenBSD 4.1で追加
- cwm(1): 軽量ウィンドウマネージャ。OpenBSD 4.2で追加
- libtool(1): ライブラリ構築自動化ツール。OpenBSD 4.3で収録
- snmpd(8): SNMP(Simple Network Management Protocol)デーモン。OpenBSD 4.3で追加
- sysmerge(8): システム設定ファイル統合ツール。OpenBSD 4.4で追加
- ypldap(8): LDAPベースのYPサーバー。OpenBSD 4.4で収録
- OpenSMTPD: SMTP(Simple Mail Transfer Protocol)サーバー。OpenBSD 4.6で導入
- tmux(1): ターミナルマルチプレクサ。OpenBSD 4.6で収録
- ldpd(8), ldpctl(8): ラベル配布プロトコル(LDP)対応。OpenBSD 4.6で追加
- mandoc(1): manページ文書化ツール。OpenBSD 4.8で導入
- ldapd(8), ldapctl(8): LDAP(Lightweight Directory Access Protocol)サーバー。OpenBSD 4.8で追加
- OpenIKED: IKE(Internet Key Exchange)プロトコル実装。OpenBSD 4.8で導入
- iscsid(8), iscsictl(8): iSCSIデーモン。OpenBSD 4.9で収録
- rc.d(8), rc.subr(8): システム初期化スクリプト管理。OpenBSD 4.9で追加
- npppd(8), npppctl(8): PPP(Point-to-Point Protocol)デーモン。OpenBSD 5.3で追加
- ldomd(8), ldomctl(8): LDOM(Logical Domains)管理ツール。OpenBSD 5.3で収録
- sndiod(8): オーディオサーバー。OpenBSD 5.3で導入
- cu(1): シリアル通信ユーティリティ。OpenBSD 5.4で追加
- slowcgi(8): 遅いHTTPリクエストを処理するツール。OpenBSD 5.4で収録
- signify(1): ファイル署名および検証ツール。OpenBSD 5.5で追加
- LibreSSL: OpenSSLをforkしてセキュリティを強化したプロジェクト。OpenBSD 5.6で初公開
- httpd(8): 軽量Webサーバー。OpenBSD 5.6で収録
- rcctl(8): rc.dサービス管理ユーティリティ。OpenBSD 5.7で追加
- doas(1): シンプルな権限昇格ユーティリティ。OpenBSD 5.8で導入
- radiusd(8): RADIUSサーバー実装。OpenBSD 5.8で追加
- eigrpd(8), eigrpctl(8): EIGRP(Enhanced Interior Gateway Routing Protocol)対応。OpenBSD 5.9で収録
- vmm(4), vmd(8), vmctl(8): 仮想マシン管理システム。OpenBSD 5.9で追加
- acme-client(1): ACMEプロトコルを使った証明書発行クライアント。OpenBSD 6.1で導入
- syspatch(8): セキュリティパッチ管理ツール。OpenBSD 6.1で追加
- xenodm(1): XDMの整理されたfork版。OpenBSD 6.1で収録
- unwind(8): ローカルDNSリゾルバ。OpenBSD 6.5で導入
- sysupgrade(8): システム自動アップグレードツール。OpenBSD 6.6で追加
- rpki-client(8): RPKI(Route Origin Validation)クライアント。OpenBSD 6.7で導入
- resolvd(8): 動的ネットワーク環境でDNS設定を管理するツール。OpenBSD 6.9で追加
- dhcpleased(8): 改良版DHCPクライアント。OpenBSD 6.9で収録
OpenBSD開発者がOpenBSD外部で保守するプロジェクト
- sudo: システム管理者が特定ユーザーに制限付きコマンド実行権限を与えられるようにするツール。OpenBSD 2.7で収録
- femail: シンプルなメール送信ツール。2005年に開始され、OpenBSD port は同年9月22日に提供
- midish: MIDIシーケンサおよび処理ツール。2003年に開始され、OpenBSD port は2005年11月4日に提供
- fdm: メールフィルタリングおよび整理ツール。2006年に開始され、OpenBSD port は2007年1月18日に提供
- toad: OpenBSD向けソフトウェア自動配布ツール。2013年に開始され、OpenBSD port は同年10月8日に提供
- docbook2mdoc: DocBook文書をmdocマニュアルページ形式へ変換するツール。2014年に開始され、OpenBSD port は同年4月3日に提供
- portroach: FreeBSDのportscoutをforkして開発されたport更新追跡ツール。2014年に開始され、OpenBSD port は同年9月5日に提供
- cvs2gitdump: CVSリポジトリをGitへ変換するツール。2012年に開始され、OpenBSD port は2016年8月1日に提供
- Game of Trees: Gitの代替となりうるバージョン管理システム。2017年に開始され、OpenBSD port は2019年8月9日に提供
1件のコメント
Hacker Newsのコメント
OpenBSD財団は約38万ドルを調達した
John Ioannidisが数週間前に亡くなったが、ほとんど誰にも気づかれなかった
OpenBSDのprivdrop/privsep設計とpledge(2)/unveil(2)の採用に加えて、最近のmimmutableのような緩和策も注目されていない
OpenBSD 5.3ではMatthew Dempskyによってランダムデータメモリが実装された
AmigaOSは1985年に位置独立実行ファイル(PIE)とASLRを使っていた
pledge/unveilがもっと目立つ形で紹介されていないことに驚きを示している
OpenBSDがISO C11 _Thread_localを実装したのか気になっている
OpenBSDのページが素のHTMLだけを使い、スタイリングやCSSを使っていない理由に疑問を呈している
もう1つの優れた資料として <a href="https://why-openbsd.rocks/" rel="nofollow">https://why-openbsd.rocks/</a> を勧めている