コース目次 / 第0章

はじめに — 動かさずに、読む

ホワイトボックス診断(ソースコードを読む)とブラックボックス診断(動かして攻撃する)の違いを理解し、source→sinkという読み方の骨格を掴みます。法と倫理ゲートに同意します。

第0章 / 全6章目安 約6分この章のゴール: ホワイトボックス診断の位置づけと、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章です。

この章はまだ完了していません。