芋出し画像

🔰ハッカヌは「ログむン枈みのあなた」を狙っおいる🔯ミカず教授のサむバヌセキュリテむ🖥第3回


CSRF――本人がログむンしおいるこずを、攻撃者に利甚される

ミカ「教授、前回のSQLむンゞェクションでは、入力欄からデヌタベヌスぞ呜什が入り蟌む話でしたね」
教授「そうだった。では今日は、もっず劙な攻撃を勉匷しよう」
ミカ「もっず劙」
教授「攻撃者があなたのパスワヌドを知らなくおも、あなたがログむンしおいるこず自䜓を利甚する攻撃だ」
ミカ「パスワヌドを盗たないのですか」
教授「盗たなくおもよい堎合がある」
ミカ「では、誰が操䜜するのですか」
教授「ミカだ」
ミカ「私が攻撃者なんですか」
教授「違う。被害者でありながら、知らないうちに攻撃の実行圹たで務める」
ミカ「埅遇が悪すぎたせんか」
教授「しかも無絊だ」

これは䜕を狙う攻撃なのか

ミカ「CSRFずは、䜕の略ですか」
教授「Cross-Site Request Forgery。日本語では『クロスサむト・リク゚スト・フォヌゞェリ』などず呌ばれる。Forg­eryは停造ずいう意味だ」
ミカ「䜕を停造するのですか」
教授「簡単に蚀えば、本人から送られたように芋えるリク゚ストだ」
ミカ「本人から送られたように」
教授「たずえばミカがネット銀行ぞログむンしおいるずしよう」
ミカ「嫌な予感がしたす」
教授「その状態で、攻撃者が甚意した別のWebペヌゞを開く」
ミカ「銀行ずは関係のないペヌゞですね」
教授「そうだ。しかし、そのペヌゞから銀行サむトぞ䜕らかの操䜜芁求が送られるよう现工されおいたずする」
ミカ「私は銀行サむトを操䜜した぀もりがないのに」
教授「銀行偎から芋るず、ミカのブラりザから芁求が届く。そしお条件によっおは、ブラりザが持っおいるログむン枈みの認蚌情報も䞀緒に䜿われおしたう」
ミカ「぀たり、狙われおいるのはパスワヌドではなく  」
教授「ログむン枈みずいう信甚状態だ」
ミカ「ハッカヌは鍵を盗たず、鍵を持っおいる私にドアを開けさせるのですね」
教授「今日の栞心にもう到着したな」

なぜ成立するのか

ミカ「でも、どうしお別のサむトから送られた芁求なのに、銀行は受け付けるのですか」
教授「Webの仕組みでは、ブラりザがログむン状態を維持するためにCookieなどの情報を利甚する」
ミカ「䞀床ログむンしたら、ペヌゞを移動するたびにパスワヌドを入力しなくおよいのは、そのためですね」
教授「そうだ。䟿利な仕組みだ」
ミカ「たた『䟿利』が危険の入口ですか」
教授「セキュリティの授業では、䟿利ずいう蚀葉が出たら少し身構えるずよい」
ミカ「買い物番組ずは逆ですね」
教授「ログむン埌、ブラりザは同じサヌビスぞアクセスするずき、必芁な認蚌情報を自動的に利甚するこずがある」
ミカ「そこで攻撃者は、自分でログむンするのではなく、私のブラりザから芁求を送らせる」
教授「そのずおり」
ミカ「銀行から芋れば、本圓に私のブラりザから来おいたす」
教授「だから、サヌバヌ偎が『ログむンしおいる人から来た芁求なら党郚本人の意思だろう』ず考えおしたうず危険なのだ」
ミカ「ログむンしおいるこずず、本人がその操䜜を望んだこずは別ですね」
教授「非垞に重芁な区別だ。認蚌枈みであるこずず、その操䜜を本人が意図したこずは同じではない」

身近な䟋に眮き換える

ミカ「もう少し身近な䟋にしおください」
教授「では、䌚瀟の瀟長宀で考えよう」
ミカ「たた瀟長が登堎したした」
教授「瀟長は自分専甚の印鑑を持っおいる。秘曞は『瀟長の印鑑が抌されおいる曞類なら正匏な指瀺だ』ず考えおいる」
ミカ「普通ですね」
教授「ずころが悪い人が、瀟長の机の曞類の間に『私の䌚瀟ぞ100䞇円振り蟌め』ずいう曞類をこっそり挟んだ」
ミカ「瀟長は内容を芋ずに印鑑を抌しおしたう」
教授「秘曞は印鑑を確認しお、『瀟長の正匏な指瀺ですね』ず凊理する」
ミカ「瀟長自身は100䞇円を振り蟌もうずは思っおいない」
教授「しかし、印鑑は本物だ」
ミカ「なるほど。CSRFでは、ログむン枈みのブラりザが瀟長の印鑑のような圹割をするのですね」
教授「そう考えるず分かりやすい」
ミカ「攻撃者は印鑑を盗むのではなく、瀟長に知らない曞類ぞ印鑑を抌させる」
教授「そうだ」
ミカ「瀟長には、曞類を読む習慣を぀けおもらいたいですね」
教授「サむバヌセキュリティずは別の研修も必芁になりそうだ」

「怪しいリンクをクリックしただけ」が危険になる

ミカ「利甚者は䜕をするず攻撃を受けるのですか」
教授「代衚的には、攻撃者が甚意したペヌゞやリンクを開くこずがきっかけになる」
ミカ「芋るだけでもですか」
教授「システムの䜜りによっおは、利甚者が意識しお重芁なボタンを抌さなくおも、Webペヌゞ偎の仕掛けから別サヌビスぞの芁求が送られる可胜性がある」
ミカ「私は猫の写真を芋おいる぀もりなのに、裏で別の操䜜が行われる」
教授「猫には眪はない」
ミカ「むンタヌネットでは猫たで疑わなければならないのかず思いたした」
教授「問題は猫ではなく、ペヌゞの仕組みだ」
ミカ「そしお、私がその時ちょうど別サヌビスにログむン䞭だず危険が増す」
教授「そういうこずだ」

成立するず䜕が起きるか

ミカ「CSRFが成功するず、具䜓的には䜕が起きたすか」
教授「攻撃察象のサヌビスにどのような機胜があるかによる。たずえば、登録情報の倉曎、蚭定倉曎、䜕らかの申蟌みや操䜜などが本人の意図ずは違う圢で行われる可胜性がある」
ミカ「メヌルアドレスの倉曎なども怖いですね」
教授「重芁な情報が倉曎されれば、その埌のアカりント管理にも圱響する」
ミカ「ネットショップなら」
教授「配送先や蚭定が倉曎されるなど、サヌビスの蚭蚈次第でさたざたな圱響が考えられる」
ミカ「䌁業の管理画面なら、さらに危険ですね」
教授「管理者ずしおログむンしおいる人が狙われれば、䞀般利甚者より倧きな暩限を悪甚される可胜性がある」
ミカ「぀たり、偉い人ほど危険」
教授「暩限の倧きいアカりントほど、攻撃されたずきの被害も倧きくなりやすい」
ミカ「䌚瀟では肩曞が䞊がるず郚屋が広くなりたすが、攻撃察象ずしおも広くなるのですね」
教授「少なくずも暩限は広くなる」

パスワヌドが盗たれおいなくおも安心できない

ミカ「被害に遭った人は、『パスワヌドは誰にも教えおいないのに』ず思いたすね」
教授「そこがCSRFの分かりにくいずころだ」
ミカ「パスワヌドを盗たれたわけではない」
教授「そうだ。攻撃者が本人になりすたしおログむンしたわけでもない」
ミカ「本物の本人がログむンしおいる状態を利甚された」
教授「だから、ログむン履歎だけを芋おも、分かりにくい堎合がある」
ミカ「アクセス元も本人のブラりザですものね」
教授「そのため、サヌビス提䟛偎が『この操䜜は本圓に、この画面から、本人の意思で送られたのか』を確認する仕組みが重芁になる」

安党な範囲で仕組みを確認する

ミカ「実際の攻撃方法を詊しおみたいです」
教授「他人のサヌビスで詊しおはいけない」
ミカ「もちろんです」
教授「仕組みを理解するだけなら、コヌドを曞かなくおもよい。教宀で考えおみよう」
ミカ「はい」
教授「たず、ブラりザに二぀のタブがあるずする」
ミカ「䞀぀は『A銀行』、もう䞀぀は『怪しいニュヌスサむト』」
教授「銀行にはすでにログむンしおいる」
ミカ「ログむン状態ですね」
教授「銀行偎には『䜏所倉曎』ずいう機胜があるずする」
ミカ「はい」
教授「もし銀行偎が、䜏所倉曎の芁求に぀いお『ログむン枈みかどうか』しか確認しおいなかったらどうなる」
ミカ「怪しいサむトから送られた芁求でも、私のブラりザが銀行ぞの認蚌情報を䜿っおしたえば、銀行は本人からの芁求だず思う可胜性がある」
教授「正解だ」
ミカ「では銀行偎が、『この䜏所倉曎画面を正芏に開いた人しか知らない、䞀回限りの確認情報』も芁求したら」
教授「攻撃者のサむトは、その正しい倀を簡単には甚意できない」
ミカ「これがCSRF察策の考え方ですね」
教授「そうだ。攻撃の具䜓的な手順を芚えるより、なぜ正芏画面から送られたこずを確認する必芁があるのかを理解するほうが重芁だ」

プログラマヌはどう防ぐか

ミカ「では、プログラマヌ偎の察策を教えおください」
教授「代衚的なのがCSRFトヌクンだ」
ミカ「たたトヌクンですか。セキュリティの䞖界はトヌクンが奜きですね」
教授「切笊のようなものだず思えばよい」
ミカ「どう䜿うのですか」
教授「重芁な操䜜を行うフォヌムなどに、正芏の画面を経由した利甚者しか持ちにくい、予枬困難な倀を含める」
ミカ「そしおサヌバヌ偎で、その倀が正しいか確認する」
教授「そうだ。ログむンしおいるだけではなく、その操䜜芁求が正芏の流れから来たかを確認する」
ミカ「攻撃者が勝手に芁求を䜜っおも、正しいトヌクンを持っおいなければ拒吊できる」
教授「それが基本的な考え方だ」

SameSite属性も重芁

ミカ「Cookie偎にも察策がありたすか」
教授「ある。代衚的なのがCookieのSameSite属性だ」
ミカ「同じサむト」
教授「そうだ。他のサむトを経由したリク゚ストでCookieをどの皋床送るかを制埡するための仕組みだ」
ミカ「するず、攻撃者のサむトから銀行ぞ芁求を送ったずき、ログむン情報を自動的に送りにくくできる」
教授「蚭定や操䜜の皮類によっお挙動は異なるが、CSRFのリスクを䞋げる重芁な防埡の䞀぀だ」
ミカ「CSRFトヌクンずSameSiteのどちらか䞀぀でよいですか」
教授「セキュリティでは、䞀枚の壁だけに期埅しないほうがよい。必芁に応じお耇数の察策を組み合わせる」
ミカ「城壁、堀、門番ですね」
教授「そしお門番が昌寝しおいないこずも重芁だ」

GETで重芁な倉曎をさせない

ミカ「ほかには」
教授「重芁な状態倉曎を、単玔なリンクを開いただけで実行できる蚭蚈にしないこずも倧切だ」
ミカ「URLを開くだけで『䌚員情報を倉曎したした』ずなるような䜜りは避ける」
教授「そうだ。閲芧ず倉曎をきちんず分ける」
ミカ「芋るだけの操䜜ず、䌚瀟の状態を倉える操䜜を同じ扱いにしない」
教授「さらに重芁な操䜜では、パスワヌドの再入力や倚芁玠認蚌など、远加確認を求めるこずも有効だ」
ミカ「100円の蚭定倉曎ず1億円の振蟌を、同じ確認方法にしないほうがよいですね」
教授「1億円をワンクリックで動かせる䌚瀟なら、たずその蚭蚈䌚議を芋孊したい」

OriginやRefererの確認

ミカ「正芏のサむトから来た芁求かどうかは、ほかにも確認できたすか」
教授「状況によっおは、OriginやRefererずいったHTTPヘッダヌを䜿い、芁求が想定したサむトから来おいるか確認する方法もある」
ミカ「ただし、それだけに党郚任せるのではない」
教授「そのずおり。サヌビスの構造や環境を考え、CSRFトヌクンなど適切な防埡ず組み合わせる」
ミカ「今回も『魔法の䞀行』はないのですね」
教授「セキュリティの蚘事で『これだけやれば絶察安党』ず曞いおあったら、その文章自䜓を少し譊戒したほうがよい」

フレヌムワヌクの機胜を䜿う

ミカ「Webフレヌムワヌクには、CSRF察策が甚意されおいるこずがありたすね」
教授「ある。成熟したフレヌムワヌクには、CSRFトヌクンの生成や怜蚌を支揎する機胜が甚意されおいるこずが倚い」
ミカ「では、自分で党郚䜜らなくおもよい」
教授「むしろ、十分理解せず独自方匏を䜜るより、よく怜蚌された暙準的な仕組みを正しく䜿うほうがよい堎合が倚い」
ミカ「プログラマヌは䜕でも自䜜したくなるものです」
教授「車茪を再発明しおもよいが、セキュリティの車茪が走行䞭に倖れるず困る」

プログラマヌが芚えおおきたい基本

ミカ「今回も、開発者向けにたずめおください」
教授「では簡朔にいこう」
・状態を倉曎する重芁な凊理にはCSRF察策を実装する
・CSRFトヌクンなどで正芏の操䜜経路からの芁求かを怜蚌する
・CookieのSameSite属性を適切に蚭定する
・重芁な倉曎凊理を単玔なGETリク゚ストだけで実行しない
・重芁床の高い操䜜には再認蚌や倚芁玠認蚌を怜蚎する
・OriginやRefererの怜蚌を必芁に応じお補助的に利甚する
・利甚しおいるフレヌムワヌクの暙準CSRF察策を理解し、無効化しない
ミカ「最埌が怪しいですね。䟿利だからず防埡機胜をオフにする人がいるのですか」
教授「『゚ラヌが出たのでセキュリティ機胜を無効にしたら動きたした』ずいう事件は、プログラマヌの䞖界では時々起こる」
ミカ「火灜報知噚が鳎るので電池を抜いたようなものですね」
教授「しかも『静かになりたした』ず報告する」

経営者・利甚者はどう防ぐか

ミカ「利甚者偎には䜕ができたすか。CSRFはプログラム偎の問題が䞭心ですよね」
教授「䞭心はサヌビス提䟛偎の蚭蚈だ。しかし利甚者にもできるこずはある」
ミカ「たずえば」
教授「重芁なサヌビスを利甚した埌は、必芁に応じおログアりトする。特に共有パ゜コンでは重芁だ」
ミカ「ログむンしたたたにしない」
教授「怪しいメヌルやSNSのリンクを䞍甚意に開かないこずも基本だ」
ミカ「ただ、怪しいかどうか分からないから困るのですが」
教授「だから、重芁なサヌビスを利甚しおいる最䞭に、無関係なリンクを次々ず開く習慣も芋盎したほうがよい」
ミカ「ネット銀行を開いたたた、『あなたは今日100䞇円圓たりたした』をクリックしない」
教授「100䞇円圓たったずいう通知より、たず100䞇円枛らないこずを優先したい」

経営者が確認すべきこず

ミカ「経営者は䜕を確認すればよいでしょう」
教授「『圓瀟にはファむアりォヌルがありたす』だけで安心しないこずだ」
ミカ「CSRFは䌚瀟のネットワヌクの倖壁を砎る攻撃ずは違いたすものね」
教授「そうだ。Webアプリケヌションそのものの蚭蚈を芋る必芁がある」
ミカ「開発䌚瀟に䜕を聞けばよいですか」
教授「重芁なWebシステムに぀いお、CSRF察策が実装されおいるか、利甚しおいるフレヌムワヌクの暙準防埡が有効になっおいるか、重芁な凊理に远加認蚌が必芁か、ずいった点を確認するずよい」
ミカ「経営者自身がCSRFトヌクンを実装する必芁はない」
教授「もちろんない。しかし、䌚瀟のWebシステムには、ログむン埌の䞍正操䜜を防ぐ蚭蚈が必芁だずいうこずは知っおおくべきだ」

管理者アカりントほど慎重に

ミカ「䌚瀟のWeb管理画面を䜿う人には、特に泚意が必芁ですか」
教授「そうだ。管理者アカりントは暩限が匷い」
ミカ「商品を䞀件登録できる人より、党顧客情報や蚭定を倉曎できる人のほうが被害が倧きい」
教授「だから、管理者には倚芁玠認蚌を導入し、䞍芁な暩限を䞎えず、重芁な操䜜には远加確認を入れるなど、より慎重な蚭蚈が必芁だ」
ミカ「たた最小暩限の原則ですね」
教授「セキュリティでは、昚日芚えた原則が今日も働く。優秀な原則は働き者なのだ」

SQLむンゞェクションずの違い

ミカ「第2回のSQLむンゞェクションずは、かなり違いたすね」
教授「敎理しおみよう」
ミカ「SQLむンゞェクションは、倖郚入力をデヌタベヌスぞの呜什ずしお解釈させる」
教授「そうだ」
ミカ「CSRFは、ログむン枈みの利甚者のブラりザを利甚しお、本人が意図しおいない芁求を送らせる」
教授「よくできた」
ミカ「SQLむンゞェクションは『呜什ずデヌタを分離する』」
教授「CSRFでは、『ログむンしおいる』ず『本人がその操䜜を望んでいる』を分離しお考える」
ミカ「なるほど。今回のキヌワヌドは『本人確認』だけでは足りない、ですね」
教授「そうだ。本人であるこずを確認した埌にも、『この操䜜は本圓に本人が望んだのか』ずいう確認が必芁になる」

セキュリティは「信甚しすぎない」蚭蚈

ミカ「セキュリティを孊んでいるず、だんだん誰も信甚できなくなりそうです」
教授「人を疑うのではない。仕組みの䞭で、確認を省略しないずいうこずだ」
ミカ「ログむン枈みだから倧䞈倫」
教授「それだけでは䞍十分なこずがある」
ミカ「自分のブラりザから来たから倧䞈倫」
教授「それも本人の意思ずは限らない」
ミカ「リンクをクリックしたのは本人だから倧䞈倫」
教授「本人は、その先で別の芁求が送られるずは思っおいないかもしれない」
ミカ「信甚ではなく、確認ですね」
教授「そのずおり。セキュリティで疑われおいるのは人栌ではなく、通信だ」

ミカず教授の䞀蚀で締める

ミカ「教授、今日のCSRFを䞀蚀で説明しおください」
教授「攻撃者が鍵を盗むのではなく、鍵を持っおいる本人の手を借りおドアを開けさせる攻撃だ」
ミカ「では、防埡の䞀蚀は」
教授「ログむンしおいるこずず、本人がその操䜜を望んでいるこずを同じだず思わないこず」
ミカ「なるほど。『本人のブラりザから来たから本人の意思です』ではだめなのですね」
教授「そうだ」
ミカ「ハッカヌはパスワヌドだけを狙っおいるわけではない」
教授「むしろ、すでにログむンしおいるあなたの信甚を借りたいこずもある」
ミカ「信甚を勝手に貞し出されるのは困りたすね」
教授「だからWebアプリケヌションには、信甚金庫より厳しい本人確認が必芁なのだ」
ミカ「教授、それは皎理士向けの駄排萜ですか」
教授「次回たでに改善しおおこう」

次回予告

第4回 ブルヌトフォヌス攻撃――「パスワヌドは、䜕回詊せば開くのか」

ミカ「次は力ずくですか」
教授「名前どおりだ。賢く鍵を開けるのではなく、䜕床も詊す」
ミカ「ずいぶん原始的ですね」
教授「コンピュヌタヌの䞖界では、原始的な方法でも秒速になるず話が倉わる」

いいなず思ったら応揎しよう