Home | Notifications | New Note | Local | Federated | Search | Logout

Note Detail


Fadis@fadis@mstdn.jp (2026-10-10 22:06:24)
CFIにはいくつかの実現方法があるが、Linuxカーネルのような低レイヤーで使いやすいように作られたのがclangのkcfi。kcfiは関数の先頭の命令の前に関数の型のハッシュ値を埋め込む。間接関数呼び出し時は呼び出す関数の型のハッシュ値と、ジャンプ先の前に書かれたハッシュ値が一致するかを確認する。
これは意図しない関数の呼び出しを完全に防ぐ物ではないが、関数の型は多様なので呼べる関数の種類はごく僅かになる。Linuxカーネルは以前からclangでビルドする場合に限りkcfiを仕込んでビルドする事ができた。何故clang限定だったかというとgccにはkcfiの実装が無かったから。
そこでKees Cook氏はclangのkcfiと同じように機能するkcfiをgccにも実装して、gccでビルドするLinuxでもcfiを使えるようにした。clangでビルドしたバイナリとgccでビルドしたバイナリが互いの関数を呼べるようにgccのkcfiにはgccに実装があり、clangでもkcfiのハッシュに指定可能なFNV-1aが選ばれた
Reply