コース目次 / 第0章

はじめに — ツールが、原理的に見つけられない領域

業務ロジックの穴と競合状態が、なぜスキャナには判定できないのかを理解します。sec-authzと同じ「人の目が要る」領域だと位置づけ、法と倫理ゲートに同意します。

第0章 / 全5章目安 約6分この章のゴール: 業務ロジックと競合状態の穴が、なぜツールに見つけられないか理解する

sec-authz で、「認可の穴はツールに見つけにくい」と学びました。理由は、「見えてよいデータか」がアプリ固有のビジネスルールで、スキャナには正解が分からないから。このコースは、その仲間——ツールが原理的に見つけられない、もう2つの領域を扱います。

業務ロジックの穴 — 正しい値は、誰が知っているか

「この商品の値段は 1,000円です」——この事実を、誰が知っているべきか。答えはサーバです。でも、実装によっては、クライアント(ブラウザ)から送られてきた値段をそのまま信じることがあります。
スキャナには、その値が「正しい1,000円」なのか「改ざんされた1円」なのかを判定できません。数値として妥当かどうかしか見られない。そのアプリにとって何が“正しい”かを知っているのは、そのアプリを作った人だけ——だから、機械には見つけられません。

競合状態 — 確認と実行の、隙間

「在庫があるか確認する」→「注文を確定する」。この2つの操作の間には、必ず時間の隙間があります。もし、その隙間に別のリクエストが割り込んで、同じ確認をすり抜けたら——在庫が1個しかないのに、2人が「在庫あり」を確認してしまい、2件とも成立してしまう。
この「確認(Time-Of-Check)と実行(Time-Of-Use)の間の隙間」を突く攻撃を TOCTOU(Time-Of-Check to Time-Of-Use)、広くは競合状態(race condition)と呼びます。スキャナは1つずつ順番にリクエストを送るのが基本で、意図的に同時に送るという発想自体、機械的な検査には向きません。

2つとも、“アプリの当たり前”が壊れる

sec-injection の穴は「入力がコードになる」という、比較的機械的なパターンでした。sec-authz と、このコースの穴は違います。

「値段は改ざんされない」「在庫は1個ずつ正しく減る」——こうしたそのアプリが暗黙に前提としている当たり前が崩れる。パターンマッチでは見つからず、そのアプリの仕様を理解した人間だけが「ここ、本当に大丈夫?」と疑える。診断で最も高度な領域の一つとされるのは、このためです。

このコースの地図

法と倫理ゲート

手を動かす前に

このコースは攻撃の技術に触れます。実習してよい相手は、次の3つだけです。

  • (a) 自分で作った練習用のやられ環境(このサイトが配る自作ターゲット)
  • (b) あなた自身の許可された環境(自分の Thousand SKY・secret-notes-ctf など)
  • (c) CTF 競技の中(規約の範囲で)

実在する第三者のシステムを許可なく触ることは、不正アクセス禁止法に触れます。 このゲートは、その線引きを毎回の入口で確かめるためのものです。詳しくは「セキュリティの法と倫理」へ。

すべて、自分の 127.0.0.1 に立てる自作ショップが相手です(法と倫理)。

章 扱うもの
第1章 業務ロジックの穴 — 価格・数量をクライアントから信じる
第2章 競合状態 — 確認と実行の隙間を、同時リクエストで突く
第3章 競合状態の修正 — 確認と実行を、1つの操作にする

準備ができたら、次の章へ。まずは、値段をめぐる業務ロジックの穴からです。

こうなっていればOK

卒業まであと4章です。

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