コース目次 / 第0章
はじめに — 動かさずに、読む
ホワイトボックス診断(ソースコードを読む)とブラックボックス診断(動かして攻撃する)の違いを理解し、source→sinkという読み方の骨格を掴みます。法と倫理ゲートに同意します。
ここまでのすべてのコースで、あなたはアプリを動かして攻撃してきました——curl や Burp でリクエストを送り、レスポンスを見て、穴を確かめる。これはブラックボックス診断と呼ばれます。中身(コード)を見ずに、外から動かして探る。
このコースは、まったく違う道具を使います。コードを読むだけで、動かさずに穴を見つける——ホワイトボックス診断です。
なぜ、読むだけで見つかるのか
考えてみれば、これまでのすべての穴は、コードの中に、はっきりと原因が書かれていました。「入力を、エスケープせずに埋め込んでいる」「所有者を確認していない」「price をクライアントから受け取っている」——攻撃して見つけたあとに読んだコードには、いつもその一行がありました。
ホワイトボックス診断は、この“その一行”を、攻撃する前に、読むだけで見つけに行く技術です。実行できない箇所(まだデプロイされていない機能、実行環境が無いバッチ処理)にも届く、動的テストには無い強みがあります。
source と sink — テイント追跡の骨格
法と倫理ゲート
手を動かす前に
このコースは攻撃の技術に触れます。実習してよい相手は、次の3つだけです。
- (a) 自分で作った練習用のやられ環境(このサイトが配る自作ターゲット)
- (b) あなた自身の許可された環境(自分の Thousand SKY・secret-notes-ctf など)
- (c) CTF 競技の中(規約の範囲で)
実在する第三者のシステムを許可なく触ることは、不正アクセス禁止法に触れます。 このゲートは、その線引きを毎回の入口で確かめるためのものです。詳しくは「セキュリティの法と倫理」へ。
コードを読むときの、中心となる考え方が2つあります。
source(発生源) — 利用者の入力が、コードの中に生まれる場所。req.query・url.searchParams・req.headers.cookie・POST のボディなど。
sink(合流点) — その値が届くと危険になる、特定の関数や場所。HTML への埋め込み、SQL 文の組み立て、シェルコマンドの実行、ファイルパスの構築など。
テイント追跡(taint tracking)とは、source で生まれた“汚れた”値が、途中で無害化(エスケープ・検証・パラメータ化)されないまま、sink に届いていないかを、コードを目で追って確かめる作業です。
これは、あなたがすでにやってきたことです。旗艦コースで send(res, 200, '<p>「' + q + '」の検索結果</p>...') という行を見つけたとき——q(source)が、エスケープを経ずに res.end の HTML(sink)に届いているのを、まさに目で追いました。ホワイトボックス診断は、その動きを体系立てて、意図的に行う技術です。
このコースの地図
| 章 | 学ぶこと |
|---|---|
| 第1章 | source と sink のカタログ — 危険な関数を、先に知っておく |
| 第2章 | 追いかける — 初見のコードで、実際にテイント追跡をする |
| 第3章 | 差分を読む — 修正前後のコードから、パターンを掴む |
| 第4章 | 読むだけでは、分からないこと — 限界と、動的テストとの併用 |
このコースは読むだけで、コードを実行する演習はありません(labType: none)。読む対象は、すべてこのサイトの教材コード(あなた自身がこれまで書いてきた自作やられ)です(法と倫理)。実在のプロダクトのソースコードを診断するには、別途契約や許可が要ります。
準備ができたら、次の章へ。まずは、探すべき「危険な関数」を先に地図にしておきます。
こうなっていればOK
卒業まであと5章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。