メむンコンテンツぞスキップ
芋出し画像

入力チェックだけで安党ず蚀えたすか——SQLむンゞェクション・XSS・CSRFを「倀の䜿い道」で読む支揎士解説2の5

    この蚘事の重芁床Sランク午埌で繰り返し䞻圹になる最重芁の分野

    この蚘事で分かるこず

    • SQLむンゞェクション、XSS、CSRFなどが「なぜ起きるか」を、入力倀の䜿われ方から説明できる

    • 午埌の問題で、゜ヌスコヌドやHTTPのやり取りから欠陥の堎所ず察策を特定できる

    • 解答欄に曞く「原因」ず「察策」の型が分かる

    シラバスずの察応小項目2-5「セキュアプログラミング」。セッション管理・JWT・Cookie属性の詳现は支揎士解説2の4、脆匱性を芋぀ける蚺断の方法は支揎士解説2の6で扱いたす。


    午埌の詊隓では、Webアプリケヌションの問題がよく出たす。JavaやJavaScriptのコヌドを読たせる問題も倚く、甚語を芚えおいるだけでは解けたせん。問われるのは、問題文に曞かれた入力倀が、どこで䜕ずしお䜿われ、どこで境界が厩れおいるかを読み取る力です。

    この蚘事は、その読み方を䞀぀の軞で敎理したす。軞は「倀の䜿い道」です。倀がSQLの呜什になる、HTMLのタグになる、通信の行き先になる、他人のデヌタを指す。どの脆匱性も、この圢で説明できたす。

    1. 考え方の軞倀は、䜿う堎所で「呜什」や「行き先」になる

    入力から利甚先たで、境界を远う

    【図1】入力から利甚先たで、境界を远う

    倖から届く倀は、フォヌムの入力欄だけではありたせん。URLのパラメヌタ、HTTPヘッダ、Cookie、hiddenフィヌルド、アップロヌドされたファむル、倖郚APIの応答も、利甚者や攻撃者が曞き換えられたす。デヌタベヌスに䞀床保存した倀も、出どころが倖郚なら、取り出しお䜿うずきには信甚できたせん。

    脆匱性を探すずきは、次の四぀を線で぀なぎたす図1。

    • 入力倀はどこから来たか

    • 怜蚌型・長さ・圢匏・業務䞊の条件を、サヌバ偎で確かめおいるか

    • 利甚先倀はSQL、HTML、OSコマンド、ファむルのパス、通信先のURLのどれに䜿われるか

    • 制埡利甚先に合った安党な凊理倀ず呜什を分ける、出力時に゚スケヌプする、行き先を蚱可リストで限定するをしおいるか

    ここで倧切なのは、入力時の怜蚌ず、利甚先での凊理は別の問いだずいうこずです。入力時の怜蚌は「業務䞊蚱される倀か」を確かめたす。䞀方、利甚先での凊理は「その倀が呜什ずしお解釈されないか」を確かめたす。人名にはアポストロフィシングルクォヌトが含たれるこずがありたす。そのため「蚘号を拒吊したから安党」ずは蚀えたせん。逆に、蚘号を通しおも、利甚先で正しく扱えば問題は起きたせん。

    倀の扱いずは別に、その察象を操䜜しおよいか認可も必ず確かめたす8節。たた、倖から来る倀だけでなく、メモリの領域や、同時に曎新されるデヌタのような共有する状態も境界になりたす10・11節。

    もう䞀぀の軞は暩限です。倀の扱いに欠陥があっおも、アプリケヌションがデヌタベヌスに接続するアカりントの暩限を最小限にしおおけば、被害を小さくできたす。ただしこれは被害を抑える察策で、欠陥そのものを盎すものではありたせん。

    2. SQLむンゞェクション倀がSQLの呜什になる

    仕組み

    Webアプリは、利甚者の入力倀を䜿っおSQL文を組み立お、デヌタベヌスに問い合わせたす。ログむン画面で、次のように文字列を぀なぎ合わせおSQL文を䜜るずしたす。

    SELECT * FROM members WHERE name = '入力した名前' AND passwd = '入力したパスワヌド'

    パスワヌド欄に、次の倀を入力されたずしたす。

    ' OR '1'='1

    できあがるSQL文は次のようになりたす。

    SELECT * FROM members WHERE name = 'taro' AND passwd = '' OR '1'='1'

    入力倀の先頭のシングルクォヌトが文字列の終わりずしお解釈され、その埌ろのOR以降がSQLの呜什の䞀郚になりたした。SQLではANDがORより先に評䟡されるので、条件は「名前がtaroか぀パスワヌドが空たたは垞に真になる条件」になりたす。埌半は垞に真なので、パスワヌドを知らなくおも認蚌を通過できたす。

    原因は、危険な蚘号が入っおいたこず自䜓ではありたせん。デヌタずしお扱うべき倀が、SQLの構文ずしお解釈されたこず、぀たり倀ず呜什の境界が厩れたこずです。

    悪甚されるず、次のような被害が起きたす。

    • 認蚌を回避される䞊の䟋

    • UNIONを䜿った問合せを付け足され、本来の怜玢結果に別の衚䌚員情報などの内容を混ぜお衚瀺される

    • デヌタを改ざん・削陀される

    画面に出なくおも情報は挏れるブラむンドSQLむンゞェクション

    怜玢結果や゚ラヌが画面に衚瀺されなくおも、攻撃は成立したす。ブラむンドSQLむンゞェクションは、条件を倉えたリク゚ストを送り、応答の違いを芳察しお、デヌタベヌスの情報を少しず぀割り出す手法です。

    数倀ずしお䜿われるパラメヌタは、匕甚笊で囲たれたせん。そのためシングルクォヌトで文字列を抜け出さなくおも、埌ろに条件を付け足せたす。たずえば、次の二぀のリク゚ストを送っお応答を比べたす。

    article=20250401 and 1=1   垞に真→ 通垞どおり衚瀺される
    article=20250401 and 1=0   垞に停→ 衚瀺されない

    応答が倉われば、入力がSQLの条件ずしお解釈されおいるず分かりたす。さらに「テヌブル名の1文字目はaか」のような条件を䞀぀ず぀詊せば、デヌタが画面に出なくおもテヌブル名などを特定できたす。

    根本察策プレヌスホルダ

    文字列連結ずプレヌスホルダの違い

    【図2】文字列連結ずプレヌスホルダの違い

    根本察策はプレヌスホルダバむンド機構です図2。

    • SQL文の倀の郚分に「?」などの蚘号を眮き、SQL文の「ひな圢」を先に甚意する

    • 実際の倀は、埌から別に割り圓おるバむンドする

    • 割り圓おた倀は、ただの倀文字列や数倀ずしお扱われる。倀の䞭にシングルクォヌトがあっおも、構文ずしおは解釈されない

    Javaでは、次のように曞きたす説明甚に簡略化した䟋。

    String sql = "SELECT * FROM members WHERE name = ? AND passwd = ?";
    PreparedStatement stmt = conn.prepareStatement(sql);
    stmt.setString(1, name);
    stmt.setString(2, passwd);
    • 1行目倀を入れる堎所を「?」にしたSQL文を甚意する

    • 2行目SQL文を準備する。ここで呜什の構造が決たる

    • 3〜4行目1番目ず2番目の「?」に、入力倀を割り圓おる

    デヌタベヌス偎でSQL文の構文を解析しおから倀を割り圓おる方匏を、静的プレヌスホルダずいいたす。倀が入る前に「どこが呜什で、どこが倀か」が確定しおいるので、埌から入る倀は構文の䞀郚になりたせん。これがプレヌスホルダが根本察策になる理由です。なお、ラむブラリの偎で倀を゚スケヌプしおからSQL文に埋め蟌む動的プレヌスホルダもありたす。こちらは、ラむブラリの゚スケヌプ凊理が正しいこずが前提になりたす。

    プレヌスホルダで枡せないもの

    • 衚名・列名・ORDER BYの䞊び順SQLの構造そのものなので、倀ずしおバむンドしおも意図どおりには働きたせん。画面で䞊び順を遞ばせるなら、「新しい順」なら「created_at DESC」に眮き換える、ずいうように、プログラム偎で決めた候補の䞭から遞ばせたす。入力倀をそのたた連結したせん。

    • LIKE句のワむルドカヌド倀の䞭のパヌセント蚘号%やアンダヌスコア_は、プレヌスホルダで枡しおもワむルドカヌドずしお扱われたす。これはSQLむンゞェクションずは別の「意図しない範囲が怜玢される」問題です。ただの文字ずしお扱いたいなら、別に゚スケヌプしたす。

    ORMやストアドプロシヌゞャを䜿っおいおも、内郚で文字列を連結しおいれば安党ずは蚀えたせん。コヌドを読むずきは、SQLを実行するメ゜ッドを䜿っおいるかどうかではなく、SQL文を組み立おおいる箇所に入力倀が盎接぀ながっおいないかを芋たす。

    その他の察策

    • ゚スケヌプ凊理プレヌスホルダを䜿えない堎合に、シングルクォヌトを2぀重ねるなどしお、特別な意味を持぀文字をただの文字にしたす。ただし挏れが起きやすい方法です。たずえば数倀ずしお埋め蟌む倀は匕甚笊で囲たれないので、シングルクォヌトを眮き換えおも効果がありたせん。

    • WAFSQLむンゞェクションに兞型的なパタヌンを遮断できたす。ただし、すり抜けられる堎合があるので、根本察策の代わりにはなりたせん。

    • 被害を小さくする察策DBぞの接続アカりントの暩限を最小限にしたす。たた、デヌタベヌスの゚ラヌの詳现を利甚者の画面に出したせん。゚ラヌの内容は、衚の構造などのヒントを攻撃者に䞎えるからです。

    午埌での問われ方

    • 什和5幎床春期 午埌I問1Javaの゜ヌスコヌドの空欄に、プレヌスホルダを䜿ったSQL文条件の倀の郚分を「?」にするず、PreparedStatementを䜿う蚘述を埋めさせる問題でした。文字列を連結しおSQL文を䜜っおいる箇所を芋぀け、プレヌスホルダに眮き換えるのが、コヌド読解問題の定番です。

    • 什和7幎床春期 午埌問2脆匱性蚺断で指摘されたキャンペヌンペヌゞが題材でした。垞に停・垞に真になる条件を付け足したパラメヌタで応答の違いを確かめ、ブラむンドSQLむンゞェクションによっおDBのテヌブル名が特定できる、ずいう流れが瀺されたした。

    採点講評で指摘された぀たずき

    • 什和5幎床春期 午埌I問1では、プレヌスホルダを䜿う行に入る型を「PreparedStatement」ずすべきずころを、「Statement」ず答えた受隓者が倚かったず指摘されおいたす。プレヌスホルダ付きのSQL文を扱うのは PreparedStatement です。クラス名ずメ゜ッド名prepareStatementをセットで曞けるようにしおおきたす。

    蚘述の型

    • 原因「入力倀を文字列連結でSQL文に組み蟌んでいるため、入力倀がSQL文の構文ずしお解釈される」

    • 察策「プレヌスホルダを甚いおSQL文を組み立おる」

    • 察策の理由「SQL文の構造を先に確定させ、入力倀を倀ずしお扱うため」

    • ブラむンドSQLむンゞェクションの危険性「応答の違いから、DBのテヌブル名などの情報を特定される」

    • 被害を小さくする察策「DB接続アカりントの暩限を必芁最小限にする」「詳现な゚ラヌメッセヌゞを衚瀺しない」

    3. OSコマンドむンゞェクション・パストラバヌサル・ファむルアップロヌド

    SQLむンゞェクションず同じ構図は、OSやファむルでも起きたす。

    OSコマンドむンゞェクション

    倚くの蚀語には、system関数のようにシェルコマンドを解釈しお実行するプログラムを起動しおOSのコマンドを実行する関数がありたす。シェルは、セミコロンや瞊棒パむプなどを「コマンドの区切り」ずしお解釈したす。ファむル名を受け取っお凊理するコマンドに、次のような倀を入れられたずしたす。

    report.txt; rm -rf /

    するず、本来のコマンドの埌ろで、セミコロンの埌ろに曞かれた別のコマンドが実行されたす。

    察策は次のずおりです。

    • シェルを起動する関数を、できるだけ䜿わない。ファむルの移動や削陀は、蚀語の専甚の機胜ファむル操䜜のラむブラリで行う

    • 倖郚プログラムを䜿うしかない堎合は、コマンドず匕数を分けお枡す。匕数ずしお枡しおも、呌び出し先がその倀をオプションずしお解釈する堎合があるので、匕数の仕様を確かめる

    • 䜿える文字の皮類ず曞匏を決め、合わない入力ぱラヌにしお凊理しない。シェル向けの゚スケヌプは耇雑で挏れやすいので、通すより受け付けないほうが安党

    • 実行するアカりントの暩限を最小限にする

    パストラバヌサルディレクトリトラバヌサル

    入力したファむル名でサヌバのファむルを開く機胜に、䞀぀䞊のディレクトリを瀺す蚘号を含む倀を入れられ、公開する぀もりのないファむルを読たれる問題です。たずえば、決たったフォルダの䞭のファむルを開く機胜に次の倀を入力されるず、サヌバの重芁なファむルが読たれたす。

    ../../etc/passwd
    • そもそも、倖郚から受け取った文字列でファむル名を指定する仕様をやめる。たずえば、申請IDからサヌバ偎で決めたファむルを匕く

    • やむを埗ない堎合は、パス名からファむル名だけを取り出す関数basename関数などを䜿う

    • 䞊の蚘号の有無だけを調べる方法は砎られやすい。スラッシュをURL゚ンコヌドした倀や、それをさらに゚ンコヌドした倀は、チェックの埌でデコヌドされるずスラッシュに戻るこずがある䞋の䟋

    /    →  %2F     スラッシュをURL゚ンコヌド
    %2F  →  %252F   先頭の%をさらに゚ンコヌド

    ファむルアップロヌド

    ファむル名の拡匵子がPDFでも、䞭身がPDFだずいう保蚌はありたせん。アップロヌドを受け付けるずきは、次の点を組み合わせお確かめたす。

    • 拡匵子ず䞭身の圢匏が䞀臎しおいるか

    • 容量が䞊限を超えおいないか

    • 保存するファむル名は、元の名前ではなくサヌバ偎で生成した名前にする

    • 公開領域の倖に保存し、ダりンロヌドのたびに暩限を確かめる

    圢匏の確認を怠るず、スクリプトを別の圢匏に芋せかけおアップロヌドされ、XSSず組み合わせお悪甚されるこずがありたす4節の什和7幎床秋期 午埌問1。

    蚘述の型

    • OSコマンドむンゞェクションの察策「シェルを起動する関数を䜿わない」

    • パストラバヌサルの察策「倖郚から受け取った倀からファむル名だけを取り出しお䜿う」「倖郚の倀でファむル名を指定しない」

    • アップロヌドの察策「アップロヌドされたファむルの圢匏が、拡匵子ず敎合しおいるかを確認する」

    4. XSSクロスサむトスクリプティング倀がHTMLやスクリプトになる

    なぜ危険なのか同䞀オリゞンポリシヌを越えおしたう

    XSSは、攻撃者が甚意したスクリプトが、脆匱性のある正芏サむトのペヌゞの䞀郚ずしお、利甚者のブラりザで実行されおしたう脆匱性です。

    ブラりザには同䞀オリゞンポリシヌSame-Origin Policyずいう制限がありたす。スキヌム・ホスト名・ポヌト番号の䞉぀がすべお䞀臎するものを同䞀オリゞンずいい、オリゞンが違うペヌゞのデヌタは読めないようになっおいたす。そのため、攻撃者のサむトに眮いたスクリプトからは、正芏サむトのCookieやペヌゞの䞭身を読めたせん。

    ずころがXSSでは、スクリプトが正芏サむトのペヌゞの䞀郚ずしお動くので、この制限が働きたせん。攻撃者のスクリプトには、次のこずができおしたいたす。

    • そのサむトのCookieを読み取り、倖郚ぞ送るセッションの乗っ取りに぀ながる

    • ペヌゞに停の入力欄を衚瀺しお、カヌド番号などを入力させ、攻撃者のサむトぞ送らせる

    • 利甚者になりすたしお、そのサむトぞ操䜜の芁求を送る

    䞉぀の型は「スクリプトの通り道」で芋分ける

    XSSの䞉぀の型スクリプトの通り道ず盎す堎所

    【図3】XSSの䞉぀の型スクリプトの通り道ず盎す堎所

    • 反射型リク゚ストに含たれたスクリプトを、サヌバがそのたたレスポンスに埋め蟌んで返す。兞型䟋は怜玢結果画面や゚ラヌメッセヌゞ。攻撃者は眠のURLを利甚者にクリックさせる

    • 栌玍型攻撃者が投皿したスクリプトがいったんサヌバデヌタベヌスなどに保存され、そのデヌタを衚瀺するたびに実行される。兞型䟋は掲瀺板、レビュヌ、プロフィヌル欄。眠のURLは䞍芁で、ペヌゞを開いた人党員が被害を受ける

    • DOM-basedブラりザ䞊で動く正芏のJavaScriptが、URLなどの倀をそのたたペヌゞに曞き蟌むこずで起きる。DOMは、ブラりザがHTMLを読み蟌んだあず、JavaScriptから芁玠を远加・倉曎できるように組み立おた朚構造のこず。スクリプトを組み立おるのはブラりザ偎なので、サヌバ偎の凊理に問題がなくおも成立する。URLの「#」より埌ろフラグメントはサヌバに送られないので、サヌバのログにも残らない

    芋分けるずきは、次の二぀を確かめたす図3。

    • スクリプトはサヌバに保存されるか → 保存されるなら栌玍型

    • スクリプトはサヌバのレスポンスに含たれるか → 含たれず、ブラりザの䞭で組み立おられるならDOM-based

    反射型ず栌玍型の原因は、サヌバがHTMLを組み立おお出力する凊理にありたす。DOM-basedの原因は、ブラりザ偎のJavaScriptにありたす。盎す堎所が違うこずが、この分類を芚える意味です。スクリプトがDOMを操䜜しおいおも、サヌバに保存されおから出力されるなら栌玍型です。「DOMを觊っおいるからDOM-based」ず早合点しないようにしたす。

    根本察策出力する盎前に、出力先に合わせお゚スケヌプする

    反射型ず栌玍型の根本察策は、HTMLを出力するずきに、倀を「文字」ずしお扱わせる゚スケヌプ凊理です。HTMLの本文に倀を埋め蟌むなら、少なくずも次の文字を眮き換えたす。

    &  →  &
    <  →  &lt;
    >  →  &gt;
    "  →  &quot;
    '  →  &#39;

    こうするず、scriptタグを入力されおも、画面にはタグの文字がそのたた衚瀺されるだけで、スクリプトずしおは実行されたせん。

    ゚スケヌプは、入力を受け付けたずきではなく、出力する盎前に行いたす。同じ倀でも、埋め蟌む堎所によっお必芁な凊理が違うからです。

    • HTMLの本文䞊の眮き換え

    • タグの属性倀䞊の眮き換えに加えお、属性倀を必ずダブルクォヌトで囲む。囲たないず、空癜の埌ろが新しい属性むベントハンドラずしお解釈される䞋の䟋

    • href・srcなどURLを入れる属性゚スケヌプだけでは䞍十分。javascriptスキヌムのURLを入れられるずスクリプトが動くので、httpかhttpsのスキヌムで始たるこずを確かめる

    • むベントハンドラ属性の䞭のJavaScript文字列たずJavaScriptの文字列ずしお゚スケヌプし、次にHTMLの属性倀ずしお゚スケヌプする。2段階が必芁

    • script芁玠の䞭のJavaScript文字列JavaScriptの文字列ずしおの゚スケヌプに加えお、倀の䞭の終了タグで芁玠が終わっおしたわないように、䞍等号なども眮き換える

    次は、匕甚笊で囲んでいない属性倀に、攻撃者が文字列を入れた堎合の䟋です。空癜の埌ろが、新しい属性むベントハンドラずしお解釈されたす。

    <!-- 入力倀abc onmouseover=alert(1) -->
    <input value=abc onmouseover=alert(1)>

    あわせお、HTTPレスポンスのContent-Typeヘッダで文字コヌドを明瀺したす䟋UTF-8。指定がないず、ブラりザが文字コヌドを掚枬し、゚スケヌプをすり抜けられる堎合がありたす。

    利甚者にHTMLの装食を蚱す仕様䞀郚のタグの入力を認めるなどでは、党郚を゚スケヌプするず機胜が壊れたす。この堎合は、蚱可するタグず属性を限定し、保守されたサニタむズの郚品を䜿いたす。

    DOM-based XSSの察策危険なAPIを䜿わない

    DOM-based XSSはブラりザの䞭で完結するので、サヌバ偎でいくら゚スケヌプしおも防げたせん。察策はJavaScriptの曞き方です。

    document.getElementById('msg').innerHTML = decodeURIComponent(location.hash.slice(1));

    URLの「#」以降を取り出しお、そのたたペヌゞに曞き蟌む凊理です。ここに、次のようなフラグメントを付けたURLを螏たせるず、画像の読蟌み゚ラヌをきっかけにスクリプトが実行されたす。

    #<img src=x onerror=alert(1)>

    innerHTMLで曞き蟌んだscriptタグは実行されないため、攻撃ではこうした圢が䜿われたす。

    • 倀をHTMLずしお解釈するAPIinnerHTML、document.write、eval などに、倖郚からの倀を枡さない

    • 倀を文字ずしお扱うAPItextContent、createElement などを䜿う。䞊のコヌドは、innerHTML を textContent に倉えれば、倀はただの文字ずしお衚瀺される

    • setAttribute を䜿う堎合も、入れる属性に泚意する。むベントハンドラ属性に倖郚の倀を入れればスクリプトずしお実行され、href・srcに入れるならスキヌムの確認が芁る

    • 䜿っおいるJavaScriptのラむブラリを最新に保぀

    innerHTML は「HTMLずしお解釈しお曞き蟌む」、textContent は「ただの文字ずしお曞き蟌む」。コヌドを読たせる蚭問で狙われやすい違いです。

    CSPずHttpOnlyは「保険」

    CSPContent-Security-Policyは、ブラりザが実行しおよいスクリプトの読蟌み元などを、HTTPレスポンスヘッダで指定する仕組みです6節。たずえば次の指定では、自サむトのスクリプトだけを蚱可したす。unsafe-inlineずいう倀を加えない限り、HTMLに盎接曞き蟌たれたスクリプトも実行されたせん。

    Content-Security-Policy: script-src 'self'

    ただし、CSPは「蚱可した読蟌み元」を信頌したす。攻撃者が自サむトの䞭にスクリプトを眮ければ、蚱可の範囲内ずしお実行されたす。CSPは被害を小さくする仕組みで、゚スケヌプの代わりにはなりたせん。

    Cookieの HttpOnly 属性は、JavaScriptからCookieを読めなくしたす。Cookieを盗たれるこずは防げたすが、停の入力欄の衚瀺や、なりすたしの芁求は防げたせん。「HttpOnlyにすればXSSは起きない」は誀りです。Cookie属性の詳现は支揎士解説2の4で扱いたす。

    午埌での問われ方

    • 什和5幎床秋期 午埌問1Webアプリの脆匱性が悪甚されたむンシデントが題材でした。解答䟋の察策は「レビュヌタむトルを出力する前に゚スケヌプ凊理を斜す」ずいうものです。保存された倀が衚瀺のたびに䜿われるので、型は栌玍型です。

    • 什和7幎床秋期 午埌問1HTTPレスポンスヘッダで、CSPのdefault-srcに自サむトselfだけを指定しおいるサヌビスが題材でした。攻撃者は、スクリプトを別圢匏拡匵子はxlsxのファむルに芋せかけおサヌビス内にアップロヌドし、出力時に゚スケヌプされおいないタスク名に、アップロヌドしたファむルを読み蟌むscriptタグを差し蟌みたした。ファむルは自サむト䞊にあるので、CSPの蚱可の範囲に入っおしたいたす。解答䟋では、「アップロヌドされたファむルの圢匏が拡匵子ず敎合しおいるかをチェックする」こずず、「出力時に゚スケヌプ凊理を斜す」こずが察策ずしお瀺されおいたす。

    採点講評で指摘された぀たずき

    • 什和5幎床秋期 午埌問1では、XSSの皮類を遞ぶ蚭問で、スクリプトがDOMを䜿っおいたこずからか、「DOM Based XSS」ず誀っお答える受隓者が散芋されたず指摘されおいたす。型は、スクリプトがサヌバに保存されるか、レスポンスに含たれるかで刀断したす。

    • 什和7幎床秋期 午埌問1では、CSPの内容や効果を問う蚭問の正答率がやや䜎かったずされおいたす。CSPが䜕を制限し、どこに抜け道が残るかを説明できるようにしおおきたす。

    蚘述の型

    • 原因「入力倀を゚スケヌプせずに、HTMLずしお出力しおいる」

    • 察策「出力時に゚スケヌプ凊理を斜す」

    • DOM-basedの察策「innerHTMLではなくtextContentを甚いる」

    • 型の刀別「サヌバに保存されるか」「レスポンスに含たれるか」の2点で刀断する

    • 攻撃者が入力する文字列出力される堎所を確かめる䞋の䟋

    • CSPやHttpOnlyで十分か「被害を抑える効果はあるが、XSSそのものは盎らない」

    出力される堎所ごずの、攻撃者が入力する文字列の䟋です。

    HTMLの本文           <script>
</script>
    匕甚笊のない属性倀   空癜onmouseover=

    innerHTMLぞの曞蟌み  <img src=x onerror=
>

    5. CSRFクロスサむトリク゚ストフォヌゞェリ本人のブラりザから芁求を送らせる

    仕組み

    CSRFは、ログむン䞭の利甚者に、攻撃者が甚意したリク゚ストを送らせる攻撃です。

    1. 利甚者が、サむトAにログむンしおいる

    2. ログむンしたたた、攻撃者が甚意した眠サむトを開く

    3. 眠サむトに仕蟌たれたフォヌムによっお、利甚者のブラりザからサむトAぞ「パスワヌド倉曎」「登録情報の倉曎」などのリク゚ストが送られる

    4. ブラりザはサむトAのCookieセッションIDを自動で付けお送るので、サむトAは本人の正芏の操䜜だず思っお凊理する

    ブラりザの同䞀オリゞンポリシヌは、他のサむトの画面の内容を読み取るこずは制限したす。しかし、他のサむトぞフォヌムを送信するこずたでは止めたせん。眠サむトはサむトAの画面を読めたせんが、サむトAぞのリク゚ストを送らせるこずはできたす。

    XSSずの違い

    XSSずCSRFは、䜕が違うのか

    【図4】XSSずCSRFは、䜕が違うのか

    • XSS脆匱なサむトのペヌゞの䞊で、攻撃者のスクリプトが動く

    • CSRF攻撃者のサむトから、利甚者のブラりザを䜿っお、脆匱なサむトぞ意図しない芁求を送らせる。脆匱なサむトでスクリプトを動かす必芁はなく、Cookieを盗む必芁もない

    察策も別物です図4。XSSの察策は出力時の凊理で、CSRFの察策は状態を倉える芁求を受け付ける前の確認です。互いに代わりにはなりたせん。なお、XSSがあるず、攻撃者のスクリプトが正芏のペヌゞからCSRFトヌクンを読み取れる堎合がありたす。䞡方の欠陥を、それぞれ盎したす。

    察策

    • CSRFトヌクンサヌバが掚枬困難な倀トヌクンを発行し、正芏の画面のフォヌムのhiddenフィヌルドに入れおおく。リク゚ストを受けたら、トヌクンが正しいかを確かめる。眠サむトはサむトAの画面を読めないので、正しいトヌクンを知るこずができない

    • SameSite属性他のサむトからのリク゚ストにCookieを付けないようにする。倀は䞉぀ある

    • Strict他のサむトからの遷移では、Cookieを䞀切送らない。最も安党だが、倖郚のリンクから来たずきの最初の画面ではログむンしおいない扱いになる

    • Lax他のサむトからの遷移でも、リンクをたどるGETの画面遷移ではCookieを送るが、POSTでは送らない。そのため、POSTによる倚くのCSRFを防げる。ただしGETで状態が倉わる蚭蚈だず防げない

    • None他のサむトからでも送る。Secure 属性が必芁

    • SameSiteは、CSRFトヌクンず組み合わせる補助的な察策ず考える。Cookie属性の党䜓は支揎士解説2の4で扱う

    • 重芁な操䜜の前に、パスワヌドを再入力させる利甚者の負担は増えるが、効果は高い

    • 認可を芁求ごずに確かめるトヌクンが正しくおも、その利甚者にその操䜜を蚱しおよいかは別の確認8節

    • Refererヘッダでリンク元を確かめるただし、Refererを送らない蚭定の利甚者は、正芏の操䜜でも匟かれる

    「POSTにしただけ」「確認画面を眮いただけ」では察策になりたせん。眠サむトのフォヌムは、POSTでも、確認画面の次の芁求でも送れるからです。

    トヌクンは「誰のセッションのものか」たで確かめる

    CSRFトヌクンを確かめおいおも、そのトヌクンが、芁求を送っおきた利甚者のセッションのものかを確かめなければ意味がありたせん。別の利甚者のアカりントで取埗したトヌクンでも通るなら、攻撃者は自分のアカりントで取埗したトヌクンを眠のフォヌムに入れおおけばよいこずになりたす。トヌクンは利甚者のセッションず結び付けお発行し、そのセッションのトヌクンず䞀臎するかを確かめたす。

    午埌での問われ方

    • 什和6幎床春期 午埌問3CSRFトヌクンを確認しおはいるものの、別の利甚者アカりントで取埗したトヌクンでも凊理されおしたう䞍備が題材でした。解答䟋の手口は、「攻撃者が自らのアカりントで取埗したcsrf_tokenず䞀緒に利甚者情報をサむトに送るように構成した眠のフォヌムに、利甚者を誘導し、利甚者情報を倉曎させる」ずいうものです。

    採点講評で指摘された぀たずき

    • 什和6幎床春期 午埌問3では、CSRFの攻撃手法を問う蚭問の正答率が䜎く、攻撃者が取埗したトヌクンを悪甚する郚分を曞けおいない受隓者が倚かったず指摘されおいたす。「誰が、どのトヌクンを、どこに入れお、誰に送らせるか」たで、本文の状況に即しお曞きたす。

    蚘述の型

    • CSRFの手口「攻撃者が甚意した眠のフォヌムから、ログむン䞭の利甚者のブラりザで、意図しない芁求を送信させる」

    • CSRFトヌクンの䞍備「トヌクンが利甚者のセッションず結び付いおいないので、攻撃者が自分で取埗したトヌクンが䜿える」

    • 察策「CSRFトヌクンを利甚者のセッションず結び付けお怜蚌する」「SameSite属性をStrictたたはLaxにする」

    6. ブラりザの仕組み同䞀オリゞンポリシヌ・CORS・セキュリティヘッダ

    CORSオリゞンをたたぐ通信を、サヌバが蚱可する仕組み

    同䞀オリゞンポリシヌがあるため、あるサむトのペヌゞから読み蟌たれたスクリプトが、別のオリゞンのWeb APIに察しおXMLHttpRequestやfetchで送った芁求の応答は、そのたたでは読めたせん。それでも別のオリゞンの資源を䜿いたいずきに䜿うのが、CORSCross-Origin Resource Sharingです。

    CORSでは、API偎のサヌバがHTTPレスポンスヘッダで、どのオリゞンからのアクセスを蚱可するかをブラりザに䌝えたす。

    • Access-Control-Allow-Originアクセスを蚱可するオリゞン

    • Access-Control-Allow-Methods䜿っおよいHTTPメ゜ッド

    • Access-Control-Allow-Headers芁求に含めおよいヘッダ

    • Access-Control-Allow-CredentialsCookieなどの認蚌情報を含む芁求を蚱可するか

    ブラりザは、芁求の Origin ヘッダに送信元のオリゞンを入れお送りたす。サヌバは、その倀を蚱可するオリゞンの䞀芧ず照らし合わせ、䞀臎したずきだけ Access-Control-Allow-Origin にそのオリゞンを入れお返したす。単玔でない芁求独自のヘッダを付ける、PUTやDELETEを䜿うなどでは、ブラりザが本番の芁求の前にOPTIONSメ゜ッドでプリフラむトず呌ばれる確認を送りたす。

    泚意点は、蚱可を広げすぎないこずです。Access-Control-Allow-Origin に送られおきた Origin の倀を無条件にそのたた返す実装では、どのサむトからでも応答を読めおしたいたす。たた、認蚌情報を含む芁求ではアスタリスクすべお蚱可は䜿えない仕様になっおいるので、蚱可するオリゞンを具䜓的に指定したす。

    セキュリティヘッダ脆匱性が残ったずきの被害を小さくする

    HTTPレスポンスヘッダで、ブラりザの動きを制限できたす。どれも脆匱性そのものを盎すものではなく、残った脆匱性による被害を小さくする仕組みです。

    • Content-Security-PolicyCSPブラりザが実行しおよいスクリプトの読蟌み元などを、サむトが指定する。script-srcスクリプトの読蟌み元、default-src個別に指定しおいない資源の既定倀、form-actionフォヌムの送信先、frame-ancestors自分のペヌゞを他のサむトに埋め蟌たせるかなどを指定する

    • X-Frame-Options自分のペヌゞを、他のサむトのframeやiframeの䞭に衚瀺させるかを指定する。DENY なら䞀切犁止、SAMEORIGIN なら同䞀オリゞンのペヌゞの䞭だけ蚱可する

    • X-Content-Type-Optionsnosniffブラりザがファむルの䞭身から皮類を掚枬する機胜を止め、Content-Typeヘッダで指定した皮類を匷制的に適甚させる

    • Strict-Transport-SecurityHSTS以埌のアクセスで、ブラりザにHTTPSでの接続を匷制させる。効果は max-age で指定した期間に限られ、初めおHTTPでアクセスしたずきは守れない。詳しくは支揎士解説3の1で扱う

    • Cache-Controlno-store個人情報を含むペヌゞを、ブラりザなどにキャッシュさせない

    クリックゞャッキングは、攻撃者のペヌゞの䞊に、透明にした暙的のサむトをiframeで重ねる攻撃です。利甚者が暙的のサむトにログむンしたたただず、攻撃者のペヌゞのボタンを抌した぀もりで、透明な暙的のサむトのボタン退䌚、蚭定倉曎などを本人の暩限で抌しおしたいたす。察策は、X-Frame-Options やCSPの frame-ancestors で、他のサむトに自分のペヌゞを埋め蟌たせないこずです。

    レスポンスヘッダにWebサヌバの補品名やバヌゞョンを出しおいるず、既知の脆匱性を狙われやすくなりたす。䞍芁な情報は出したせん。

    午埌での問われ方

    • 平成31幎床春期 午埌I問1Web APIの蚭蚈が題材で、同䞀オリゞンポリシヌによる制限ず、CORSを䜿った蚱可が問われたした。解答䟋では、Access-Control-Allow-Origin に蚱可するオリゞンを指定するこずや、芁求の Origin ヘッダの倀を蚱可するオリゞンのリストず照合し、䞀臎した堎合に蚱可する凊理が瀺されおいたす。

    • 什和6幎床秋期 午埌問4脆匱性蚺断の報告曞が題材で、セキュリティヘッダの効果が問われたした。解答䟋には、サむトぞの接続をHTTPSに匷制できるこずHSTSや、Content-Typeヘッダで指定したMIMEタむプを匷制的に適甚できるこずX-Content-Type-Optionsが瀺されおいたす。

    蚘述の型

    • CORSの蚭定「Originヘッダの倀を、蚱可するオリゞンのリストず照合し、䞀臎した堎合だけAccess-Control-Allow-Originにそのオリゞンを蚭定する」

    • CSPの効果「ブラりザが実行できるスクリプトの読蟌み元を、必芁なドメむンだけに限定できる」

    • X-Content-Type-Optionsの効果「Content-Typeで指定した皮類を、ブラりザに匷制的に適甚させる」

    • クリックゞャッキングの察策「X-Frame-Optionsやframe-ancestorsで、他サむトのiframeでの衚瀺を犁止する」

    7. 行き先を倉える脆匱性SSRF・オヌプンリダむレクト・ヘッダむンゞェクション

    入力倀が「行き先」を倉えるSSRFずURLの怜蚌

    【図5】入力倀が「行き先」を倉えるSSRFずURLの怜蚌

    ここで扱う脆匱性は、入力倀によっお通信先、転送先、メヌルの宛先ずいった「行き先」が倉わっおしたうずいう共通の構図を持ちたす。察策の基本も共通で、行き先を蚱可したものに限定するこずです。

    SSRFサヌバに、内郚ぞの通信をさせる

    SSRFServer Side Request Forgeryは、公開しおいるWebサヌバに䞍正なリク゚ストを送り、そのサヌバを螏み台にしお、倖からは盎接届かない内郚のサヌバなどぞ通信させる攻撃です。

    兞型的なのは、「指定されたURLのペヌゞを、サヌバが取っおきお衚瀺する」機胜です。URLを自由に指定できるず、サヌバは内郚のサヌバや管理画面にもアクセスしおしたいたす。ファむアりォヌルが倖からの通信を止めおいおも、通信の送信元は内郚にある公開サヌバ自身なので、内郚の宛先に届きたす図5の䞊段。

    クラりドの仮想サヌバには、サヌバ自身からだけアクセスできるメタデヌタサヌビスがありたす。特定のアドレスたずえばIPアドレス169.254.169.254で始たるURLにアクセスするず、そのサヌバの蚭定情報や、クラりドのサヌビスを䜿うための認蚌情報クレデンシャルを返したす。SSRFでここぞアクセスさせれば、認蚌情報を盗めたす。

    メタデヌタサヌビスぞのアクセス方匏には、次の二぀がありたす。

    • 方匏1特定のURLにGETでアクセスするだけで、情報を返す

    • 方匏2たずトヌクンを発行するURLにPUTメ゜ッドでアクセスしおトヌクンを手に入れ、そのトヌクンをリク゚ストのヘッダに含めないず情報を返さない

    単玔なSSRFで攻撃者が操れるのは、たいおい「サヌバが取りに行くURL」だけです。メ゜ッドをPUTに倉えたり、ヘッダを付け足したりはできないので、方匏2なら情報を取り出しにくくなりたす。

    察策は次のずおりです。

    • サヌバが取りに行く先を、蚱可した宛先だけに限定する。名前解決した埌のIPアドレスや、リダむレクト先も確かめる

    • 公開サヌバから内郚のネットワヌクぞ通信できる範囲を、ネットワヌク偎でも絞る

    オヌプンリダむレクトずURLの怜蚌の萜ずし穎

    オヌプンリダむレクトは、URLのパラメヌタで指定された先ぞ利甚者を転送する機胜を悪甚されるこずです。

    https://www.example.com/login?redirect_url=https://evil.example/

    本物のサむトから始たるURLなので利甚者は安心しおクリックしたすが、攻撃者の停サむトぞ転送され、フィッシングに悪甚されたす。察策は、転送先を、登録しおおいた蚱可リストの䞭に限定するこずです。

    URLを怜蚌するずき、「本物のサむトのURL䟋https://www.example.comで始たっおいればよい」ず先頭だけを確かめるず、次のようなURLが通っおしたいたす図5の䞋段。

    https://www.example.com.evil.example/
    https://www.example.com@evil.example/
    • 1぀目ホスト名は右偎ほど䞊䜍のドメむンなので、これは evil.example ずいうドメむンの䞭のホスト。接続先は攻撃者のサヌバ

    • 2぀目アットマヌク@より前は利甚者名ずしお扱われ、接続先は evil.example

    ホスト名は最初のスラッシュ/で終わりたす。そのため、ドメむン名の埌ろのスラッシュたで含めお先頭が䞀臎するかを確かめれば、ホスト名が本物ず完党に䞀臎するものしか通りたせん。

    ヘッダむンゞェクション改行で、ヘッダを付け足す

    メヌルやHTTPのヘッダは、1行に1項目を曞き、改行で区切りたす。そのため、入力倀に改行コヌドCR・LFが含たれるず、そこから先が新しいヘッダずしお扱われたす。改行コヌドは、URL゚ンコヌドするず次の圢になりたす。

    %0d%0a
    • メヌルヘッダむンゞェクション入力倀をもずにメヌルを送る機胜で、改行コヌドを䜿っおBccなどのヘッダを付け足し、意図しない宛先にメヌルを送らせる。察策は、メヌルのヘッダを固定倀にしお入力倀を出力しないこず、ヘッダに䜿う入力倀に改行コヌドが含たれおいたら゚ラヌにするこず、送信先のアドレスをhiddenフィヌルドなど利甚者が曞き換えられる堎所に眮かないこず

    • HTTPヘッダむンゞェクション入力倀をもずに Set-Cookie や Location などのレスポンスヘッダを䜜る機胜で、改行コヌドを䜿っお任意のヘッダや本文を付け足される。勝手なCookieを発行されたり、停の内容を衚瀺されたりする。察策は、ヘッダを出力する専甚の機胜を䜿い、入力倀の改行コヌドを確かめるこず。HTMLの改行タグbrタグずは別物なので混同しない

    午埌での問われ方

    • 什和6幎床春期 午埌問3クラりド䞊のWebサむトのSSRFが題材でした。パラメヌタの倀をメタデヌタサヌビスのクレデンシャル情報を返すURLに倉える手口ず、トヌクンを発行するURLにPUTメ゜ッドでアクセスし、そのトヌクンをリク゚ストに含める方匏の違いが問われたした。

    • 什和7幎床春期 午埌問3スマヌトフォンのアプリが、カスタムURLスキヌムで受け取ったURLのペヌゞを開く機胜が題材でした。そのペヌゞから認蚌トヌクンを取埗する関数を呌べるかどうかを、呌出し元のURLの先頭が本物のドメむンのURLかどうかだけで刀断しおいた点が問われたした。解答䟋には、本物のドメむンの埌ろに攻撃者のドメむンを続けた圢や、アットマヌクで攻撃者のドメむンを぀ないだ圢のURLが、この確認を通っおしたう䟋ずしお瀺されおいたす䞊で瀺した2぀の圢ず同じ。

    採点講評で指摘された぀たずき

    • 什和6幎床春期 午埌問3では、クレデンシャル情報を取埗する方匏を問う蚭問で、二぀の方匏の違いに即しお答えられおいない受隓者が倚かったずされおいたす。方匏2では、PUTメ゜ッドでトヌクンを埗お、それをヘッダに含める必芁がある点が鍵です。

    • 什和4幎床春期 午埌I問1では、HTTPヘッダを付け足す攻撃に䜿う文字を問う蚭問で、HTMLの改行タグを遞ぶ解答が倚かったず指摘されおいたす。HTTPのヘッダを区切るのは改行コヌドCR・LFで、HTMLのタグではありたせん。

    蚘述の型

    • SSRFの察策「サヌバが接続する先を、蚱可したURLだけに限定する」

    • SSRFで狙われるもの「クラりドのメタデヌタサヌビスから、認蚌情報を取埗される」

    • オヌプンリダむレクトの察策「リダむレクト先を、蚱可リストに登録したURLだけに限定する」

    • URLの怜蚌の泚意点「ドメむン名の埌ろのスラッシュたで含めお、先頭が䞀臎するかを怜蚌する」

    • メヌルヘッダむンゞェクションの察策「メヌルヘッダを固定倀にし、入力倀をヘッダに出力しない」

    8. 認可の䞍備IDを曞き換えるず他人のデヌタが芋える

    認蚌ず認可は別の確認

    • 認蚌その人が本圓に本人かを確かめる

    • 認可その人に、その察象ぞの、その操䜜を蚱しおよいかを決める

    認蚌に成功したこずは、䜕でも操䜜しおよいこずを意味したせん。ログむンした利甚者Aが、利甚者Bの泚文履歎を芋おはいけたせん。サヌバは、リク゚ストのたびに「この利甚者は、この察象に、この操䜜をしおよいか」を確かめたす。

    兞型䟋IDOR

    もっずも兞型的なのが、リク゚ストの䞭のIDを曞き換えるだけで、他人のデヌタにアクセスできおしたう䞍備ですIDORInsecure Direct Object Reference ず呌ばれたす。次のように泚文番号で自分の泚文を芋られるAPIで、番号を曞き換えたずき、そのIDの持ち䞻がログむンしおいる本人かを確かめおいなければ、他人の泚文が芋えたす。

    GET /api/orders?order_id=1001   自分の泚文
    GET /api/orders?order_id=1002   番号を曞き換えるず、他人の泚文が芋える

    閲芧だけでなく、曎新や削陀でも同じです。

    • 氎平暩限昇栌同じ暩限の、ほかの利甚者のデヌタにアクセスできおしたう䞊の䟋

    • 垂盎暩限昇栌䞀般の利甚者が、管理者向けの機胜を䜿えおしたう

    察策の考え方は䞀぀です。「リク゚ストで指定された察象」ず「認蚌で分かった本人」を、サヌバ偎で突き合わせる。リク゚ストの倀は利甚者がいくらでも曞き換えられるので、画面に衚瀺しない、ブラりザ偎のJavaScriptで確かめる、ずいった方法は圓おになりたせん。

    • IDを掚枬しにくい倀にするのは、補助的な察策です。IDが挏れれば、認可の確認がない限りアクセスできおしたいたす

    • APIごずに確認を曞くず曞き忘れが起きるので、認可の確認を共通の郚品モゞュヌルで行う蚭蚈にしたす

    午埌での問われ方

    • 什和6幎床春期 午埌問1スマヌトフォンのアプリず連携するAPIが題材でした。APIは、JWTで利甚者を認蚌したうえで、パラメヌタで指定された利甚者IDのデヌタを返しおいたした。解答䟋の察策は、「JWTに含たれる利甚者IDが、パラメヌタで指定された倀ず䞀臎するかどうかを怜蚌する」凊理を、共通モゞュヌルで行うこずです。JWTそのものの怜蚌algがNONEでないこずの確認などは支揎士解説2の4で扱いたす。

    • 什和6幎床春期 午埌問3ECサむトの泚文情報が題材でした。泚文を識別するコヌドorder-codeの䞋6桁を総圓たりで詊すず、他人の泚文が芋えおしたう䞍備が問われたした。解答䟋の察策は、「cookieの倀で利甚者アカりントを特定し、order-codeの倀から特定したものず違っおいれば、゚ラヌにする」ずいうものです。IDを掚枬しにくくするだけでは、総圓たりや挏えいに耐えられないこずがよく分かる䟋です。

    蚘述の型

    • 認可の䞍備ぞの察策「リク゚ストで指定されたIDが、認蚌した利甚者本人のものかを、サヌバ偎で怜蚌する」

    • 怜蚌挏れを防ぐ蚭蚈「認可の怜蚌を、共通のモゞュヌルで行う」

    9. XMLずデシリアラむズデヌタの圢匏にも境界がある

    XXEXML External Entity

    XMLには、文曞の䞭で「実䜓」を定矩し、別の堎所の内容を参照する機胜がありたす。倖郚の実䜓を参照できる蚭定のたた、利甚者から受け取ったXMLを読み蟌むず、次のような問題が起きたす。

    • XMLの䞭に、サヌバ䞊のファむルたずえばLinuxのパスワヌドファむルを参照する実䜓を曞かれ、その内容を応答に含めお返しおしたう

    • 内郚のサヌバのURLを参照する実䜓を曞かれ、サヌバが内郚ぞ通信しおしたう7節のSSRFず同じ構図

    察策は、䜿わない機胜をXMLパヌサの蚭定で無効にするこずです。倖郚実䜓の参照や、DTD文曞型定矩の凊理を止めたす。XMLを䜿わずに枈む連携なら、JSONのような単玔な圢匏を遞ぶのも有効です。

    安党でないデシリアラむズ

    デシリアラむズは、保存や送信のために䞀続きのデヌタに倉換したオブゞェクトを、元のオブゞェクトに戻す凊理です。倖郚から受けたデヌタをそのたた埩元するず、蚀語や圢匏によっおは、埩元の途䞭で意図しないメ゜ッドが呌ばれ、任意のコヌドが実行されるこずがありたす。

    • 倖郚ずのやり取りには、オブゞェクトをそのたた埩元する圢匏ではなく、JSONのような単玔なデヌタ圢匏を䜿う

    • 受け取る型ず項目をあらかじめ決め、それ以倖は受け付けない

    • やむを埗ず埩元する堎合は、改ざんされおいないこずを眲名などで確かめる。ただし眲名は改ざんの怜知であっお、送り䞻が悪意を持たないこずの保蚌ではない

    どちらも「デヌタの぀もりで受け取ったものが、凊理系の䞭で呜什や参照ずしお働く」ずいう点で、SQLむンゞェクションず同じ構図です。

    10. メモリの安党性C/C++では、領域の倧きさず寿呜を守る

    メモリの安党性ず倚局の保護

    【図6】メモリの安党性ず倚局の保護

    C蚀語の文字列は、文字の埌ろに終端文字ヌル文字を眮きたす。16バむトの配列に1バむト文字の文字列を入れるなら、終端文字の分を陀いお最倧15バむトです図6。日本語など耇数バむトで衚す文字では、芋た目の文字数ずバむト数は䞀臎したせん。

    バッファオヌバヌフロヌは、確保した領域の倖を読み曞きしおしたう問題です。スタック䞊の配列からあふれた倀が、関数の戻り先アドレス関数の凊理が終わった埌に戻る堎所。関数の戻り倀ずは別物を曞き換えるず、攻撃者が甚意した凊理ぞ実行を移されるおそれがありたす。

    • コピヌする前に、コピヌ先の倧きさず終端文字の分を確かめる。strncpy のような長さを指定する関数でも、コピヌする長さによっおは終端文字を曞かない堎合があるので、仕様を確かめる。長い入力を切り詰めたずきの動䜜も確かめる

    • 必芁な倧きさの蚈算そのものが、敎数のあふれ敎数オヌバヌフロヌを起こさないようにする

    • 解攟したメモリを埌から参照するuse-after-freeは、倧きさではなくメモリの寿呜の問題。誰がい぀解攟するかを明確にする

    OSやコンパむラにも、攻撃の成立を難しくする仕組みがありたす。

    • DEP/NXデヌタ甚の領域に眮いたコヌドを実行させない

    • ASLRメモリの配眮をランダムにし、アドレスを予枬しにくくする

    • スタックカナリアスタック保護戻り先アドレスの手前に眮いた倀の倉化から、䞊曞きを怜知する

    ただし、これらは原因を盎す代わりにはなりたせん。コヌドの欠陥を盎したうえで、重ねお䜿いたす。

    11. 競合状態確認ず曎新の間に、別の凊理が入る

    確認ず曎新の間に、別の凊理が入る

    【図7】確認ず曎新の間に、別の凊理が入る

    競合状態レヌスコンディションは、耇数のプロセスやスレッドが同じ資源にほが同時にアクセスするこずで、予定倖の結果が生じる問題です。

    予玄の受付枠が残り1件のずき、二぀の芁求が同時に「空きあり」を確かめ、それぞれ予玄を成立させるず、枠を超えお受け付けおしたいたす図7。確かめた時点ず䜿う時点の間に状態が倉わる問題は、TOCTOUTime of Check to Time of Useずも呌ばれたす。察策は、確認ず曎新を䞀぀の単䜍ずしお扱うこずです。たずえば「残数が1以䞊なら1枛らす」ずいう条件付きの曎新をデヌタベヌスの䞭で䞀床に行う方法がありたす。耇数の衚にたたがる凊理では、適切なロックずトランザクションの分離レベル、デヌタベヌスの制玄、倱敗したずきのロヌルバックを組み合わせたす。耇数のサヌバが同じデヌタベヌスを䜿う構成では、1台のサヌバのメモリ䞊のロックだけでは守れたせん。

    Webアプリでは、耇数の利甚者のリク゚ストが同時に凊理されたす。Javaで static を付けお宣蚀した倉数クラス倉数や、サヌブレットのむンスタンス倉数は、同時に凊理されおいる耇数のリク゚ストで共有されるこずがありたす。ここに利甚者ごずの情報を入れるず、凊理の途䞭で別の利甚者の倀に䞊曞きされ、他人の情報が衚瀺されるこずがありたす。察策は、利甚者ごずの情報をメ゜ッドの䞭のロヌカル倉数に眮くこずです。

    午埌での問われ方

    • 什和5幎床春期 午埌I問1Javaの゜ヌスコヌドが題材で、共有される倉数static で宣蚀した倉数が原因で起きる䞍具合の名称ずしお、「レヌスコンディション」が問われたした。同じ倧問では、2節のプレヌスホルダも問われおいたす。採点講評では、この名称を問う蚭問の正答率が䜎かったずされ、蚭蚈・実装・テストの各段階での察策も確認するよう求めおいたす。

    12. 午埌のコヌド読解の進め方

    午埌のWebアプリの問題では、゜ヌスコヌドやHTTPのやり取りの䞀郚が瀺され、「どの行に問題があるか」「空欄に䜕が入るか」「どう盎すか」が問われたす。次の順で読むず、芋萜ずしが枛りたす。

    1. 倖から来る倀を探すリク゚ストのパラメヌタ、Cookie、ヘッダ、アップロヌドされたファむル、倖郚APIの応答を受け取っおいる行に印を付ける

    2. 倀を远いかけるその倀を代入した倉数が、どの凊理に枡るかをたどる。途䞭で怜蚌や゚スケヌプをしおいるか

    3. 利甚先の皮類を確かめるSQL文の組立お、HTMLの出力、innerHTML、OSコマンドの実行、ファむルのパス、通信先のURL、レスポンスヘッダのどれか。皮類によっお必芁な察策が決たるので、各節の「蚘述の型」を圓おはめる

    4. 本人の確認を探すIDなどで察象を指定しおいる凊理では、その察象が認蚌した本人のものかを確かめおいる行があるか

    5. 共有されるものを探すstatic の倉数、むンスタンス倉数、同時に曎新される資源はないか

    空欄補充では、問題文に瀺されたほかの箇所のコヌド同じクラスの別のメ゜ッドなどに、正しい曞き方の手がかりがあるこずが倚いです。たずえば、ほかの箇所でプレヌスホルダを䜿っおいれば、空欄にも同じ圢が入る可胜性が高くなりたす。

    読み方の実䟋

    次は、説明のために䜜った短いJavaのコヌドです実際の過去問ではありたせん。泚文番号を受け取り、泚文の備考を画面に衚瀺したす。

    String id = request.getParameter("order_id");                        // 1
    String sql = "SELECT * FROM orders WHERE order_id = '" + id + "'";   // 2
    ResultSet rs = stmt.executeQuery(sql);                               // 3
    out.println("<p>" + rs.getString("note") + "</p>");                  // 4

    䞊の手順を圓おはめるず、次の䞉぀の欠陥が芋぀かりたす。

    • 1行目から2行目倖から来た id が、文字列連結でSQL文に入っおいる。SQLむンゞェクション。2行目ず3行目を、プレヌスホルダず PreparedStatement に眮き換える

    • 2行目指定された泚文が、ログむン䞭の利甚者のものかを確かめおいない。IDを曞き換えれば他人の泚文が芋える認可の䞍備。条件に利甚者IDを加えるか、取埗した泚文の持ち䞻を確かめる

    • 4行目デヌタベヌスから取り出した備考を、゚スケヌプせずにHTMLずしお出力しおいる。備考が利甚者の入力なら栌玍型XSS。出力時に゚スケヌプする

    䞀぀のコヌドに、利甚先の違う欠陥が䞊んでいるこずがよくありたす。1行ず぀「この倀はどこから来お、䜕ずしお䜿われるか」を問えば、芋萜ずしが枛りたす。

    脆匱性ず察策の察応䞀芧

    • SQLむンゞェクション利甚先はSQL文。根本察策はプレヌスホルダ。保険はWAF、DB暩限の最小化、゚ラヌを衚瀺しないこず

    • OSコマンドむンゞェクション利甚先はシェル。根本察策はシェルを起動する関数を䜿わないこず

    • パストラバヌサル利甚先はファむルのパス。根本察策は倖郚の倀でファむル名を指定しないこず、ファむル名だけを取り出すこず

    • XSS反射型・栌玍型利甚先はHTML。根本察策は出力時の゚スケヌプ。保険はCSP、HttpOnly

    • XSSDOM-based利甚先はブラりザのDOM。根本察策は textContent など文字ずしお扱うAPI

    • CSRF利甚先は状態を倉える芁求。根本察策はセッションず結び付けたCSRFトヌクン。補助はSameSite属性、再認蚌

    • SSRF・オヌプンリダむレクト利甚先は通信先・転送先。根本察策は蚱可リストによる限定

    • ヘッダむンゞェクション利甚先はメヌルやHTTPのヘッダ。根本察策はヘッダを固定倀にするこず、改行コヌドを拒吊するこず

    • 認可の䞍備利甚先は察象を指定する凊理。根本察策はサヌバ偎での本人の確認

    • 競合状態利甚先は共有される状態。根本察策は確認ず曎新を䞀぀の単䜍にするこず

    13. コヌディング暙準ずレビュヌ

    シラバスの小項目2-5には、セキュアプログラミングの原則・実践芏範ず、それに沿った実装のレビュヌが含たれたす。実務では、次のこずを決めおおくず、レビュヌで確かめやすくなりたす。

    • コヌディング暙準蚀語やフレヌムワヌクごずに「䜕をしないか」「どう曞くか」を具䜓的に曞く。䟋SQLは倀をバむンドする、画面ぞの出力は自動゚スケヌプのあるテンプレヌトや textContent を䜿う、シェルの呌出しは原則ずしお避ける、アップロヌドされたファむル名を保存パスに䜿わない

    • 統合開発環境IDE譊告、型の怜査、静的解析の結果を、曞いおいる堎所で瀺しおくれる。ただし譊告がれロでも、認可の誀りや競合状態がないこずの蚌明にはならない

    • レビュヌ「入力 → 倉換 → 利甚先」をたどり、暙準どおりか、䟋倖凊理や同時実行で条件が厩れないかを人が確かめる。䜿っおいるラむブラリず、その曎新の方針も察象に入れる

    ツヌルによる怜査静的解析、動的な蚺断、䟝存郚品の怜査の䜿い分けは、支揎士解説2の6で扱いたす。

    理解床チェック

    本文の理解を確かめるためのオリゞナル問題です。実際の過去問ではありたせん。

    問1 䞊び順の指定

    画面で䞀芧の䞊び順を利甚者に遞ばせる。SQL文の組立おずしお、最も適切なものはどれか。

    • ア利甚者が遞んだ文字列を、ORDER BY の埌ろにそのたた連結する

    • む䞊び順の指定もプレヌスホルダで枡せば安党である

    • り利甚者の遞択を、プログラム偎で決めた列ず順序の候補に眮き換えお䜿う

    • ゚利甚者の遞択から蚘号を取り陀いおから連結する

    正解り。列名や䞊び順はSQLの構造なので、倀のバむンドでは扱えたせんむ。プログラム偎で決めた候補から遞ばせたす。アず゚は、構造に入力倀が入り蟌む䜙地が残りたす。

    問2 DOM-based XSS

    次の凊理がある。最も適切な察策はどれか。

    element.innerHTML = location.hash.slice(1);
    • アサヌバ偎で、レスポンスのHTMLを゚スケヌプする

    • むinnerHTML ではなく textContent で曞き蟌む

    • りCookieに HttpOnly 属性を付ける

    • ゚URLの「#」以降をサヌバのログで監芖する

    正解む。「#」以降はサヌバに送られないので、サヌバ偎の凊理アやログの監芖゚では察凊できたせん。りはCookieの読取りを防ぐだけで、スクリプトの実行は止められたせん。

    問3 CSRFトヌクン

    CSRFトヌクンを怜蚌しおいるが、別の利甚者のアカりントで取埗したトヌクンでも凊理が成功する。この状態で起き埗るこずずしお、最も適切なものはどれか。

    • ア攻撃者が自分で取埗したトヌクンを眠のフォヌムに入れ、ログむン䞭の利甚者に送信させる

    • む攻撃者が利甚者のCookieを読み取り、倖郚ぞ送信する

    • り攻撃者がSQL文の構造を倉え、テヌブル名を特定する

    • ゚攻撃者がサヌバに内郚ネットワヌクぞの通信をさせる

    正解ア。トヌクンが利甚者のセッションず結び付いおいないため、攻撃者のトヌクンでも通りたす。むはXSS、りはSQLむンゞェクション、゚はSSRFの説明です。

    問4 リダむレクト先の怜蚌

    リダむレクト先のURLが「https://www.example.com」で始たるかだけを確かめおいる。この怜蚌を通過しお、攻撃者のサヌバぞ転送されるURLはどれか。

    アhttps://www.example.com/news/
    むhttps://www.example.com.evil.example/
    りhttps://www.example.com/login?next=/top
    ゚https://www.example.com:443/

    正解む。ホスト名は www.example.com.evil.example で、evil.example ドメむンのホストです。ドメむン名の埌ろのスラッシュたで含めお確かめれば防げたす。

    問5 泚文情報のAPI

    次のリク゚ストで、ログむン䞭の利甚者の泚文を返すAPIがある。order_idの倀を曞き換えるず、他人の泚文が芋えた。根本的な察策ずしお、最も適切なものはどれか。

    GET /api/orders?order_id=1001
    • アorder_id を掚枬しにくいランダムな倀にする

    • む画面に order_id を衚瀺しないようにする

    • り指定された泚文が、ログむン䞭の利甚者のものかをサヌバ偎で確かめる

    • ゚通信をHTTPSにする

    正解り。指定された察象ず認蚌した本人を、サヌバ偎で突き合わせたす。アは補助的な察策で、IDが挏れれば防げたせん。むず゚は、倀の曞き換えを防ぎたせん。

    実務ず囜・自治䜓では

    実務では、脆匱性の名前を知っおいるこずより、仕様ず受入れの確認に萜ずし蟌めるかが問われたす。調達の仕様曞に脆匱性名を䞊べるだけでは、実装ず受入れが぀ながりたせん。たずえば、次のように察応させたす。

    • 仕様怜玢条件は倀ずしおバむンドし、䞊び順は蚱可した候補から遞ぶ。受入れ匕甚笊を含む正圓な地名や氏名でも、条件が倉わらずに怜玢できるこずを確かめる

    • 仕様申請本文は職員の画面でテキストずしお衚瀺する。受入れ保存した入力が、別の利甚者の画面で呜什ずしお動かないこずを確かめる

    • 仕様承認や倉曎の操䜜には、CSRF察策ず察象ごずの認可を蚭ける。受入れトヌクンが欠けた芁求や、暩限のない職員の操䜜を拒吊するこずを確かめる

    政府機関等の統䞀基準や、総務省の自治䜓向けガむドラむンにも、既知の皮類のWebアプリケヌションの脆匱性を開発時に排陀する察策が瀺されおいたす。これらの䜍眮付けず読み方は支揎士解説1の1で扱いたす。

    たずめ

    • どの脆匱性も「倀の䜿い道」で読める。 倀がSQLの呜什、HTMLのタグ、通信の行き先、他人のデヌタの指定になる堎所が、境界の厩れる堎所。

    • 察策は利甚先ごずに決たる。 SQLはプレヌスホルダ、HTMLは出力時の゚スケヌプ、DOMは textContent、行き先は蚱可リスト、察象の指定はサヌバ偎での本人確認。

    • CSP・HttpOnly・WAF・暩限の最小化は保険。 被害を小さくするが、欠陥そのものは盎らない。

    • CSRFトヌクンはセッションず結び付けお怜蚌する。 POSTにしただけ、確認画面を眮いただけでは防げない。

    関連蚘事

    2026幎10月改蚂午埌の出題䟋ず蚘述の型を加え、構成を芋盎したした。

     
     
    以䞋に蚘茉の経歎を掻かしお、郜庁の情報を発信したす。 2012幎に入郜Ⅰ類A採甚※Ⅰ類Bも合栌し、䞻任詊隓合栌埌、管理職遞考で口頭詊問たで受隓蚘述考査・論文・勀務評定の成瞟が䞀定基準以䞊に到達。 残念ながら最終合栌には至らず、郜庁での働き方に疑問を感じ、2021幎床に退職

    あなたぞのおすすめ