Fil-C、メモリ安全なコンテキスト切り替え実装
原題: Memory Safe Context Switching
なぜ重要か
メモリ安全言語の重要性が増す中、既存C/C++資産との互換性を保ちながらセキュリティ機能を強化する技術は、レガシーシステムの現代化戦略として業界的価値が高い。
メモリ安全なC言語実装「Fil-C」がバージョン0.680以降、setjmp/longjmpおよびucontext APIを完全にメモリ安全な方式で対応した。これらのAPI呼び出しの誤用によるスタック破損やダングリングスタック実行を防ぎ、安全性違反時にはパニックで程式を停止させる。Boostのファイバー実装など、広く使用されているこれらのAPIを、従来実装では発生しうる危険な動作を排除した形で提供している。
Fil-CはC/C++互換性を維持しながらメモリ安全性を強化するプロジェクトで、今回の更新ではコンテキスト切り替えAPI対応が主な改善となっている。
従来のC実装では、setjmp/longjmpやucontext API(getcontext、setcontext、makecontext、swapcontext)の誤用が重大な問題を引き起こす。具体例として、ある関数内でsetjmpまたはgetcontextでコンテキストを保存した後、その関数から戻るか、スレッドを終了すると、保存されたコンテキストはもはや存在しないスタックフレームの復元を試みダングリングポインタ状態になる。同様にmakecontextで作成したコンテキストが指すスタックを解放してからswapcontextやsetcontextを実行すると、ダングリングスタック上での実行が発生する。
Fil-Cはこうした危険な使用パターンを検出し、実行時にパニック(安全エラー)を発生させることで、プログラムの予測不可能な動作や攻撃を防止する。特にダングリングスタック上での実行は従来実装では最も分かりにくいクラッシュを招き、デバッガですらスタックトレース表示が不可能になる場合があるが、Fil-Cではそうした危険な状態そのものを排除している。
setjmp/longjmpはC言語のシグナルハンドラ内での例外処理実装に広く用いられ、ucontext APIはコルーチンやファイバー実装に使用されている。ただしdarwin OSではucontext APIの廃止が進む一方、glibc環境では継続して支持されている。Fil-Cはソースコードからのビルドにより、これらAPI群をメモリセーフな形で完全に機能させることを実現している。