46.3K Views
September 04, 23
スライド概要
Security.Tokyo #2資料
小川 静的解析ツールで生まれた SQLインジェクション
自己紹介 小川 経歴 ~2009: Webアプリ開発のバイト&業務委託 2009~2019: 三菱重工 イット何も関係ない。野良のパソコンの大先生してた 2019~いま: root ip B2BのSaaS作ってます PHPとVue分かる人来て!!1
面白かった脆弱性 - CVE-2023-22727 PHPフレームワーク CakePHP 4 のSQLインジェクション脆弱性 ORM limit(), offset() でSQLi CVSS v3 9.8 2023/01に修正済み CakePHP Laravelの次に使用率高いフレームワーク(多分) 割と使いやすいからお勧め 一般にコード品質が上がる静的解析ツールの使用で逆に発生
まず脆弱性の説明
CVE-2023-22727 $query = $itemsTable->find() ->where([ 'category' => 3, 'created >' => '2023-01-01', ]) ->order('id’) ->limit(100); 右でも左でもない普通のORM SELECT * FROM items WHERE category = 3 AND created > '2023-01-01' ORDER BY id LIMIT 100;
CVE-2023-22727 $query = $itemsTable->find() ->where([ 'category' => 3, 'created >' => '2023-01-01', ]) ->order('id’) ->limit('100; TRUNCATE users;#’); 右でも左でもない普通のORM 普通にSQLi通った SELECT * FROM items WHERE category = 3 AND created > '2023-01-01' ORDER BY id LIMIT 100; TRUNCATE users;#
CVE-2023-22727 Ver 4で何故こんな単純なものが? そもそも脆弱性か? ユーザ入力をそのまま使うなハゲ
CVE-2023-22727 経緯がある Ver. 4.2まで安全だった intにキャストされる。適当に放り込んでも大丈夫 仕様を知っていればサニタイズしてない可能性 アップデートしたら急にSQLi通って死ぬ
CVE-2023-22727 発生時のCommit 「int|null|object」を期待 (Docコメント) 「null|objectでなければ(int)キャスト処理」 が消えた
CVE-2023-22727 どうして・・・
どうして・・・
静的解析使ってますか? 静的解析のエラー修正で発生した コミットメッセージ “Fix errors reported by psalm.” psalm: PHPの静的解析ツール 型関係のエラーを検査 ロジック、未定義変数、汚染チェックなど多機能 自動修正もできる 今日の開発では必須
静的解析使ってますか? 欠点: うるさい
自動修正 自動化してこそイットだよなぁ?
自動修正 結果 (int)キャストが…消えた…?
なんで? 引数の型宣言機能はある e.g. function limit(int $num) {...} union型非対応の古いPHPサポートの為 Docコメントでだけ宣言 Docコメントの宣言をもとにキャスト削除 でも強制でないのでstring型も通ってしまう Docにだけある型宣言
この自動修正ヤバい…ヤバくない? ここだけ見たら脆弱性絶対作るマシーン ほかも見ると9割方は問題なし。外部とのIFに使うと危ない 古いPHPは消えていくのでヨシ
まとめ コード品質が上がる静的解析でも脆弱性が生まれることがある 開発者向け 静的解析は正義 でも自動修正には気をつけよう セキュリティ研究者向け GitHubで「静的解析かけた」みたいなcommit漁ると何かあるかも 他のOSSでも似たような事例なかった?
おわり 資料は𝕏の@hogeに置いておきます