2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
静的解析ツールで生まれたSQLインジェクション(全1記事)
リンクをコピー
記事をブックマーク
小川氏:小川と申します。「静的解析ツールで生まれたSQLインジェクション」というタイトルで発表いたします。よろしくお願いします。
自己紹介を簡単に。経歴ですが、昔学生の時にWebアプリ開発のバイトをしていて、就職後は10年ぐらいぜんぜん違う、製造業で働いていました。ずっとパソコンを見ていたら目が悪くなるかなと思ってほかの業界に行ったのですが、結局ずっとExcelやWordを見ていて、あまり変わりませんでした。
結局やはりITだなと思って、最近root ipという会社に転職して、BtoBのSaaSを作っています。PHPとVueがわかる人が今本当に欲しいので、誰か心当たりがあったら来てください。
おもしろかった脆弱性というところで、今日はCVE-2023-22727というものを紹介します。
これは何かというと、PHPのフレームワークのCakePHP 4で、SQLインジェクションがあったというものです。ORMのlimit、offsetというところでSQLi(SQLインジェクション)が通った。CVSSとしては9.8という、最近「curl」の作者がブチ切れていたやつと同じぐらいの危険度です。
(会場笑)
すでに半年以上前から修正しているので、もう出してもいいかなというやつです。
PHPをあまり使っていないとご存じないかもしれませんが、CakePHPは、たぶんLaravelの次ぐらいに使用率が多いフレームワークで、けっこう日本でも使われているので、わりかし危なかったんじゃないかなというやつです。わりかし使いやすいやつですね。
コード品質が上がる静的解析ツールを使ってフレームワークのコードをきれいにした時に逆に(インジェクションが)発生したという、ちょっとおもしろい事例というところで、今日持ってきました。
みなさんは脆弱性に興味があると思うので、まず脆弱性から説明します。
(スライドを示して)こんなもんで、ごく普通のORMです。簡単にORMの説明をしておくと、下のようなSQLをプログラミング言語っぽくこんな感じで書いたら、よしなに作ってくれるやつですね。
ここのlimitに、こんな感じのTRUNCATEとかを適当に放り込んだら、ごく当たり前にSQLiが通ってしまったというやつです。
(会場笑)
ユーザー入力を検索結果が入るところに放り込んだら死んだという事例です。
「マジで?」と思ったんですが、バージョン4.2というけっこうなバージョンで、今さらなんでこんなのが出てくるんだろう、とか。
(会場笑)
そもそもこれは、脆弱性じゃなくて仕様じゃないのかなとか。
(会場笑)
あと、これを見たら、たぶんユーザー入力をそのまま使うな、とか、そういう思いをいろいろ持つと思うんです。
これにはちょっと経緯があって。もともとバージョン4.2まではintにキャストされていたんですね。だから何を放り込んでも、死にはしなかった。
その仕様を知っていればサニタイズしなかったので、バージョンアップすると逆にヤバかったという罠があったということです。
何が起きていたのかと思って、当時のコミットログを見てみました。簡単に解説すると、limitというORMの関数にnumという引数を入れて、こいつがnullかobjectじゃなかったらintにキャストするというやつがあったんですが、こいつが消えていました。
「何や、これは?」というところで、ちょっと現場猫感を感じながら。
(会場笑)
その原因を追究したのがここからです。
ちょっと話は変わるのですが、静的解析ツールをみなさんご存じでしょうか? 開発をやっている方は、きっとご存じだと思います。コミットメッセージで「Fix errors reported by psalm」という、「Psalm」というものがあって、これはPHPの静的解析ツールです。なので、これは静的解析ツールのエラー修正の時に発生したというものになっています。
これが何をやってくれるかというと、型がおかしいよとか、ロジックとか、この変数使っていないよとか、動かす前にまず静的にこれをいろいろ調べて、しかも修正もしてくれるという、だいぶすごいツールです。最近の開発はみんなこれを使っていて、「これがあったらどんどんバグが減るぞ」みたいなすごいツールです。
これがめちゃめちゃ指摘をしてくるんですね。これが起きた時のフレームワークで試しにやってみたら342件エラー、と言われて。これはきついなと。
自動修正機能があるので、たぶん「手でやっていられない」と思って、バッとやったと思うんですよ。僕も試しにやってみたところ、intキャストが消えました。
(会場笑)
これかと。たぶん、intキャストが消えて、ただの代入になったので、さらにこのif文も消えてコミットされたのかなと。
「これは何や?」と思いました。ちょっといろいろあるのですが、PHPにも引数の型宣言機能があります。
(スライドを示して)例えばこんな感じで、「int $num」とか。ただちょっと、objectも受けられるかたちで、古いPHPはunion型が非対応だったので、たぶんあえてint | objectみたいなものを書かずに、Docコメントという、IDEとか静的解析でチェックしてくれるコメントで教えるだけに留めるとやったっぽいんですね。
静的解析ツールは、こいつを信じて「キャスト要らないな」と消してしまったらしく、でも、Docコメントは強制じゃないので、string型でも通って、無事死亡したというアレですね。
この自動修正はヤバいんじゃないのと、さすがにissueを上げようかと思って調べたのですが、このRedundantCastなんちゃらかんちゃらというやつを調べたら、同じところで出ているやつの9割方は大丈夫だったんですね。
外部とのインターフェイスで、強制がないところがちょっヤバかったという感じで、union型が使えないPHPはもう死んでいくので、まぁ、いいかなということでちょっと流しました。
ということでまとめですが、コード品質が上がる静的解析ツールでたまに脆弱性が生まれることがあります。
開発の人にとっては、やはりこいつは正義なので使いましょうということなんですが、自動修正、特にインターフェイス部分ではちょっと気をつけましょう。
あと、ここに書き忘れたのですが、MySQLとかだったら複文実行を禁止している、クエリを2個以上投げられない機能があるので、それを有効にすれば、こういう、後ろにTRUNCATEみたいな、めちゃくちゃやってくるやつは防げます。テストのために無効にして、これを投げたら本当に通ったのでめっちゃビビったんですけど。
(会場笑)
僕、通らないって知っていたんですよ。もともとキャストされると知っていたから。まさにこの、知っていた人間がかまされたというやつで、めっちゃビビりましたが、気をつけましょう。ユーザー入力もきちんとチェックしましょうという話ですね。
あと、ちょっとオブラートに包んで、セキュリティ研究者向けの話で、「GitHub」で「静的解析かけた」とか、ツール名が入ったコミットを漁ったら、きっとおもしろいものが出てくるんじゃないかなと思っています。
(会場笑)
あと、検索してもぜんぜん見つけられなかったんですが、(スライドを示して)ほかのOSSではこんな感じで、同じように「静的解析ツールに言われたから直したわ」みたいなコミットメッセージで爆発したやつがあったような気がしたのですが、誰か知っていたら教えてください。ちょっと思い出せませんでした。というわけで終わりです。
資料は「Twitter(現「X」)」の「@hoge」というところに置いておきますので、よろしくお願いします。以上です。
(会場拍手)
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05