ハッカーが利用するTOCTOU脆弱性とは。ファイルのすり替えで乗っ取られるシステム

プログラムが「このファイルは安全かな」って先にチェックしてから使うとするよね。でも、その間に悪い人が中身をこっそり入れかえてしまったら・・・安全じゃないファイルを使っちゃうかもしれない。
※イメージです。
目次
TOCTOUとは
TOCTOU(Time-of-Check to Time-of-Use)とは、「チェックしたとき」と「実際に使ったとき」の間に何かが変わってしまい、それを攻撃者に悪用される脆弱性のことです。
たとえば、「このファイルが安全かどうかチェックしてから使う」というプログラムがあったとします。しかし、チェックと使用の間にファイルをすり替えることができれば、安全ではないファイルが使われてしまうことになります。これがTOCTOU脆弱性です。
攻撃タイミング
処理として「チェック」してから「実行」する。
1.チェック
・ファイルの有無・権限を調べる。(安全なファイルを確認)
2.実行
・ファイルを開いて使う。(安全なファイルを使用)
但し「チェック」と「実行」の間に、不要な攻撃タイミングがある場合、
1.チェック
・ファイルの有無・権限を調べる。(安全なファイルを確認)
2.不要な攻撃タイミング
・攻撃者が「安全なファイル」から「危険なファイル」にすり替える。
3.実行
・ファイルを開いて使う。(攻撃者の危険なファイルを使用。)
TOCTOUの発生原因
この脆弱性は、主に以下のような場面で発生します。
・プログラムがファイルの存在確認(例:stat())を行ったあとに、ファイルを開く。(例:open())
・その間に、攻撃者がシンボリックリンクやハードリンクでファイルをすり替える。
・結果として、意図しないファイルにアクセス、書き込み、実行が行われてしまう。つまり、「確認」と「利用」の間にスキマがあり、そこを突かれるのです。
シンボリックリンクとは
・別のファイルを指し示すだけの“案内板”のようなファイルです。
・Windowsでいう「ショートカット」と似ています。
・中身は「このリンク先は○○ファイルですよ」というパス情報だけ。
ハードリンクとは
・ハードリンクは、本物のファイルそのものへの別名。
・実体(データ)を共有しているので、どの名前からアクセスしてもまったく同じ中身。
よくある攻撃例として
・ファイルの差し替え
プログラムが、/tmp/secure.logに出力しようとする場面で、
1.攻撃者が、/tmp/secure.logをシンボリックリンクで、/etc/passwdにしておく。
2.プログラムが、/tmp/secure.logの存在を確認。(チェック)
3.ファイルを開いて書き込み。(ファイルを使用)
→ /etc/passwdが上書きされ、システムに不正なユーザーが追加されてしまう。
エクスプロイト手法
・攻撃者は、ln -sなどで、対象ファイルを他の重要ファイルにリンクさせる。
・プログラムが、stat()と、open()を使っている場合、その間に入れ替えが可能。
・書き込み先が、/etc/shadowや、/etc/sudoersなら、致命的なシステム被害に。
※/etc/shadowは、Linuxのパスワードが入っている、超重要ファイルです。
対策と防御策
open()で、O_CREAT | O_EXCLを使う
int fd = open("file.txt", O_WRONLY | O_CREAT | O_EXCL, 0600);
・何ができる
ファイルが「なかったら作る」「あったら失敗する」=つまり一発勝負で安全に作成できます。
・なぜ安全なのか
ファイルの存在チェックと作成を同時に行うので、攻撃者が入れ替えるスキを与えません。
openat()とfstat()を組み合わせる
int dirfd = open("/tmp", O_RDONLY);
int fd = openat(dirfd, "targetfile", O_RDWR);
fstat(fd, &info);
・何ができる
openat()で、「特定のフォルダの中のファイルだけ」を開くことができる。
・なぜ安全なのか
ファイルディスクリプタ(fd)を使って安全性を確認できるから、途中ですり替えられても気づける。要するに、「ファイル名ベース」ではなく、「開いた実物(fd)ベース」で確認する。
/tmpディレクトリの利用に注意
/tmpは誰でもファイルを作れる場所
→ 攻撃者がリンクを仕込んだり、名前をかぶせてくる可能性がある。
・対策方法
/tmpではなく、専用の安全なフォルダを使う。(例:/var/tmp/myapp/)
mkstemp()で安全なファイルを作る。
O_NOFOLLOWフラグを使ってシンボリックリンクをたどらないようにする。
ハッカーが利用するTOCTOU脆弱性とは。ファイルのすり替えで乗っ取られるシステムのまとめ
TOCTOU(Time-Of-Check to Time-Of-Use)脆弱性とは、プログラムがファイルなどを「チェック」してから「使う」までの間にできる“スキマ時間”を悪用される問題です。
たとえば、安全なファイルか確認したあと、実際に開く前に攻撃者が別のファイルにすり替えると、悪意のあるデータが使われてしまいます。
Linuxの一時ファイルや特別な権限(SUID)プログラムで起きやすく、重要なシステムファイルが改ざんされる可能性もあります。
対策としては、mkstemp()やopen()の安全な使い方、ファイルディスクリプタでの確認などがあります。
一見地味に見える脆弱性ですが、悪用されると大きな被害につながることがあります。