Linux Sandboxes and Fil-C

2025/12/14 7:58

Linux Sandboxes and Fil-C

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

メモリ安全性とサンドボックスはプログラムの異なる部分を保護するため、両方が強力なセキュリティに必要です。純粋な Java プログラムはメモリ安全であってもファイルシステムの syscalls を通じて任意のファイルを書き込むことができるし、逆にすべての能力を取り消したアセンブリプログラムでもメモリバグがある場合がありますが、カーネルが特権 syscalls を殺すためサンドボックスから逃げられません。サンドボックスは意図的に許容範囲を広く設計しているため、攻撃者は残されたメモリ安全性のバグを利用してブローカー・プロセスへ到達することができるので、両方の防御を組み合わせるとより強固な保護が得られます。

本書では、C/C++ 用に設計され、システムコールまで安全性を保証し、init や udevd などの低レベルコンポーネントで使用できるメモリ安全ランタイム「Fil‑C」への OpenSSH の seccomp ベース Linux サンドボックス移植方法について説明します。OpenSSH は既に chroot を採用し、

sshd
ユーザー/グループとして特権なしで実行し、
setrlimit
を使用し、非許可 syscalls を
SECCOMP_RET_KILL_PROCESS
で殺す seccomp‑BPF フィルタを適用しています。Fil‑C はその runtime 内で自動的にこれらの syscalls を許可することで簡素化します。背景スレッドは存続させつつスレッド生成を防ぐため、Fil‑C は API
void zlock_runtime_threads(void)
を追加し、必要なスレッドを事前確保してシャットダウンを無効にします。

OpenSSH の seccomp フィルタは強化されています。失敗時の挙動が

SECCOMP_RET_KILL
から
SECCOMP_RET_KILL_PROCESS
に変更され、mmap 許可リストに新たに
MAP_NORESERVE
フラグが追加され、
sched_yield
が許可されています。サンドボックスは二つの
prctl
コール(
PR_SET_NO_NEW_PRIVS
PR_SET_SECCOMP
)で構築され、エラー検出も行われます。Fil‑C のランタイムは
filc_runtime_threads_handshake
で全スレッドとハンドシェイクし、各スレッドが no_new_privs ビットと seccomp フィルタを持つことを保証します。複数のユーザー スレッドが検出された場合、安全エラーが発生します。

メモリ安全性とサンドボックスを組み合わせることで、OpenSSH はより厳格な隔離を実現し、メモリバグによる権限昇格リスクを低減します。このアプローチは他のセキュリティクリティカルプロジェクトにも採用を促す可能性があります。

本文

メモリ安全性とサンドボックス化

メモリ安全性とサンドボックスは別々の概念です。
互いに独立しており、メモリ安全性があるからといって必ずしもサンドボックス化されているわけではなく、逆もまた同様です。

  • メモリ安全だがサンドボックス化されていない 例:純粋な Java プログラムで、ユーザー入力に応じて任意のファイルを読み書きできるもの。OS はユーザーがアクセス可能なファイルなら何でも上書き許可します。プログラム自体はメモリ安全でも危険です。
    サンドボックスもなく、Java ランタイムにコード実行バグがあれば、攻撃者は任意のファイルを上書きできるでしょう。

  • サンドボックス化されているがメモリ安全でない 例:OS に対して「計算だけ許可」するよう要求するアセンブリプログラム。カーネルはファイル関連システムコールを試みるとプロセスを終了させます。多くのメモリ安全性バグ(アセンブリではよくある)があっても、ファイルを書き換えることはできません。

実際にはサンドボックスに意図的な穴が存在します。サンドボックス化されたプロセスは権限付き仲介プロセスとメッセージングできます。攻撃者はメモリ安全性バグを利用して悪意あるメッセージを送信し、仲介プロセスに乗っ取る可能性があります。

最良の防御は サンドボックス化+メモリ安全性 の両方です。
この文書では Fil‑C のメモリ安全機能と OpenSSH の seccomp ベース Linux サンドボックスを組み合わせる方法を説明します。


背景

Fil‑C は C/C++ のメモリ安全実装です。多くの安全言語とは異なり、コードが Linux システムコールに到達する直前まで安全性を保証し、

init
udevd
など低レベルコンポーネントでも十分に動作します。OpenSSH を含む多くのプログラムは Fil‑C 上で実行され、seccomp‑BPF サンドボックスを利用しています。

OpenSSH は非特権 sshd‑session プロセスに対して以下でサンドボックスを構築します。

  1. chroot – ファイルシステムビューを制限。
  2. 非特権ユーザー/グループ
    sshd
    で実行し、追加の権限は付与しない。
  3. setrlimit – ファイルオープン数・プロセス生成・書き込みを制限。
  4. seccomp‑BPF – 非特権プロセスに許可されたシステムコールだけを列挙し、他は
    SIGSYS
    を送る。

Chromium と Mozilla は seccomp‑BPF による Linux サンドボックスの優れたノートを公開しています。

Fil‑C は chroot やユーザー/グループ変更を簡単に扱えるようにしており、これらは Fil‑C で trivially 許可されます。

setrlimit
seccomp‑BPF
は Fil‑C ランタイムがスレッドを生成しメモリを確保・同期するため、特別な配慮が必要です。


Fil‑C ランタイムでのスレッド作成防止

Fil‑C ランタイムは GC 用にバックグラウンドスレッドを起動し、アイドル時に停止します。
プログラムが再び活性化すると、そのスレッドは自動的に再開されます。

新しいスレッドの生成は OpenSSH の

setrlimit
で「新プロセス禁止」ルール(スレッドは軽量プロセス)を破ることになり、
clone3
などが許可されていないためです。
この回帰を防ぐために
<stdfil.h>
に次の API を追加しました。

void zlock_runtime_threads(void);

zlock_runtime_threads()
はランタイムが必要とする全スレッドを即座に作成し、停止させないようにします。
OpenSSH では
ssh_sandbox_child()
内で setrlimit や seccomp コールの前に呼び出されます。


OpenSSH サンドボックスへの調整

zlock_runtime_threads()
が以降のスレッド生成をブロックするため、既存の
setrlimit
はそのままで問題ありません。
seccomp フィルタには次の変更を加えました。

変更点理由
SECCOMP_RET_KILL_PROCESS
を採用(
SECCOMP_RET_KILL
ではなく)
サンドボックス違反時に Fil‑C バックグラウンドスレッドを終了させるため。
MAP_NORESERVE
を mmap の許可リストへ追加
Fil‑C アロケータが必要とするオプションで、セキュリティ上の懸念はない。
sched_yield
を許可
意味的にノーオペレーションであり、Fil‑C がロックに使用している。

他に変更は不要です。必須の

futex
系システムコールは既に許可済みです。


Fil‑C での
prctl
実装

OpenSSH は seccomp フィルタを二つの

prctl
呼び出しで設置します。

/* PR_SET_NO_NEW_PRIVS */
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) {
    debug("%s: prctl(PR_SET_NO_NEW_PRVSS): %s",
          __func__, strerror(errno));
    nnp_failed = 1;
}

/* PR_SET_SECCOMP */
if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &preauth_program) == -1)
    debug("%s: prctl(PR_SET_SECCOMP): %s", __func__, strerror(errno));
else if (nnp_failed)
    fatal("%s: SECCOMP_MODE_FILTER で設定に失敗しました。", __func__);

これらのシステムコールは呼び出しスレッドだけに影響します。特別な処理を行わないと、Fil‑C のバックグラウンドスレッドは

no_new_privs
やフィルタを持たず、メモリ安全性バグでサンドボックスを回避できてしまいます。

対策として Fil‑C ランタイムは独自のラッパーを実装しました。

/* 各ランタイムスレッドでコールバックを呼ぶ。 */
PAS_API void filc_runtime_threads_handshake(
    void (*callback)(void* arg), void* arg);

このコールバックが各スレッドに対して要求された

prctl
を実行し、すべてのスレッドで
no_new_privs
が設定され、seccomp フィルタが適用される
ことを保証します。

プログラムが複数ユーザー・スレッドを持つ場合、これら二つの

prctl
は Fil‑C の安全性エラーを引き起こします。


結論

堅牢なセキュリティにはメモリ安全性とサンドボックス化を併用することが不可欠です。
本ガイドでは、OpenSSH の seccomp サンドボックスを Fil‑C へ移植しつつ、元の保護レベルと Fil‑C のメモリ安全保証を維持する方法を示しました。

同じ日のほかのニュース

一覧に戻る →

2025/12/14 9:34

An Implementation of J

## Japanese Translation: ## 改訂版要約 本書は、技術仕様の構造化された目次であり、以下のように整理されています。 1. **第0章 – はじめに** 2. **第1章 – 文を解釈する** - 1.1 単語生成 - 1.2 構文解析 - 1.3 トレイン(列車) - 1.4 名前解決 3. **第2章 – 名詞** - 2.1 配列 - 2.2 型 - 2.3 メモリ管理 - 2.4 グローバル変数 4. **第3章 – 動詞** - 3.1 動詞の構造 - 3.2 ランク - 3.3 原子(スカラー)動詞 - 3.4 オブヴァース、同一性、および変種 - 3.5 エラー処理 5. **第4章 – 副詞と接続詞** 6. **第5章 – 表現** - 5.1 原子表現 - 5.2 ボックス化された表現 - 5.3 木構造表現 - 5.4 線形表現 7. **第6章 – ディスプレイ** - 6.1 数値表示 - 6.2 ボックス化表示 - 6.3 フォーマット済み表示 主要セクションの後に、付録A〜F(インキュナブルム、スペシャルコード、テストスクリプト、プログラムファイル、外国接続詞、およびシステム概要)が補足資料として提供されます。書末には参考文献・用語集・索引が付されています。 この構成(目次 → 詳細セクション → 付録 → 参照資料)は、読者に全体枠組みを最初に把握させたうえで、必要に応じて詳細へ掘り下げたり補足資料を参照したりできる明確かつ階層的な道筋を提供します。

2025/12/14 8:39

Closures as Win32 Window Procedures

## Japanese Translation: **改訂版要約:** この記事では、Win32 のウィンドウプロシージャに追加のコンテキストポインタを渡す方法を示しています。これは、WndProc が通常 4 つしか引数を取らないため、ネイティブ API には備わっていない機能です。著者は x64 アセンブラで小さなトランスペイル(trampoline)を作成し、実行時に JIT コンパイルして 5 番目の引数スロットを挿入し、呼び出し前に必要なコンテキストを格納します。これにより、各ウィンドウがグローバル変数や `GWLP_USERDATA` を使わずに独自の状態を保持できるようになります。トランスペイルは GNU アセンブラで書かれ、`.exebuf` セクション(`bwx` フラグ付き)から 2 MiB の実行可能バッファが確保されます。C ヘルパー関数 `make_wndproc(Arena *, Wndproc5, void *arg)` は 2 つのバイトオフセットプレースホルダーを修正してトランスペイルを生成します。作成後は `set_wndproc_arg(WNDPROC p, void *arg)` を使ってコンテキストを変更できます。アロケータ例では、異なる状態オブジェクト用に複数のトランスペイルを生成したり、動的に切り替えたりする方法を示しています。この手法は、トランスペイルがアンウインドテーブルを持たないため Windows Control Flow Guard 下でも安全に機能し、グローバル変数を使わずにウィンドウごとのデータを付与する低レベルの手段を示しています。

2025/12/14 6:18

Recovering Anthony Bourdain's (really) lost Li.st's

## Japanese Translation: **概要:** 著者は、Greg TeChnoLogY の Anthony Bourdain リストから欠落した項目を復元するために、Common Crawl インデックスを照会する Python 3.14.2 スクリプト *commoncrawl_search.py* を作成しました。サイト全体をダウンロードする代わりに、スクリプトは検索語句と一致する URL プレフィックスのみを返す単一のインデックスリクエストを送信し、帯域幅を大幅に削減しクエリ速度を向上させます。この手法は標準的なオープンソース慣行に従っており、アーカイブ済みデータセットから失われた Web コンテンツを復旧する以前の試みを継承しています。今後はより複雑な検索に対応できるようツールを拡張し、リスト項目のさらなる自動復元を実現する可能性があります。成功すれば、研究者やファンがアクセスできるようになり、大規模公開アーカイブからデータを抽出する実用的な方法を示し、将来の Web 保存プロジェクトに情報を提供できるでしょう。

Linux Sandboxes and Fil-C | そっか~ニュース