【注意】このサイトに記載されていることを他人に試すことは「不正アクセス禁止法」に該当する場合があります。詳しくはこちらから

ハッカーが利用する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()の安全な使い方、ファイルディスクリプタでの確認などがあります。
一見地味に見える脆弱性ですが、悪用されると大きな被害につながることがあります。