静的解析ツールで生まれたSQLインジェクション

45.5K Views

September 04, 23

スライド概要

Security.Tokyo #2資料

profile-image

パソコンの大先生です

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

小川 静的解析ツールで生まれた SQLインジェクション

2.

自己紹介 小川 経歴 ~2009: Webアプリ開発のバイト&業務委託 2009~2019: 三菱重工 イット何も関係ない。野良のパソコンの大先生してた 2019~いま: root ip B2BのSaaS作ってます PHPとVue分かる人来て!!1

3.

面白かった脆弱性 - CVE-2023-22727 PHPフレームワーク CakePHP 4 のSQLインジェクション脆弱性 ORM limit(), offset() でSQLi CVSS v3 9.8 2023/01に修正済み CakePHP Laravelの次に使用率高いフレームワーク(多分) 割と使いやすいからお勧め 一般にコード品質が上がる静的解析ツールの使用で逆に発生

4.

まず脆弱性の説明

5.

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;

6.

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;#

7.

CVE-2023-22727 Ver 4で何故こんな単純なものが? そもそも脆弱性か? ユーザ入力をそのまま使うなハゲ

8.

CVE-2023-22727 経緯がある Ver. 4.2まで安全だった intにキャストされる。適当に放り込んでも大丈夫 仕様を知っていればサニタイズしてない可能性 アップデートしたら急にSQLi通って死ぬ

9.

CVE-2023-22727 発生時のCommit 「int|null|object」を期待 (Docコメント) 「null|objectでなければ(int)キャスト処理」 が消えた

10.

CVE-2023-22727 どうして・・・

11.

どうして・・・

12.

静的解析使ってますか? 静的解析のエラー修正で発生した コミットメッセージ “Fix errors reported by psalm.” psalm: PHPの静的解析ツール 型関係のエラーを検査 ロジック、未定義変数、汚染チェックなど多機能 自動修正もできる 今日の開発では必須

13.

静的解析使ってますか? 欠点: うるさい

14.

自動修正 自動化してこそイットだよなぁ?

15.

自動修正 結果 (int)キャストが…消えた…?

16.

なんで? 引数の型宣言機能はある e.g. function limit(int $num) {...} union型非対応の古いPHPサポートの為 Docコメントでだけ宣言 Docコメントの宣言をもとにキャスト削除 でも強制でないのでstring型も通ってしまう Docにだけある型宣言

17.

この自動修正ヤバい…ヤバくない? ここだけ見たら脆弱性絶対作るマシーン ほかも見ると9割方は問題なし。外部とのIFに使うと危ない 古いPHPは消えていくのでヨシ

18.

まとめ コード品質が上がる静的解析でも脆弱性が生まれることがある 開発者向け 静的解析は正義 でも自動修正には気をつけよう セキュリティ研究者向け GitHubで「静的解析かけた」みたいなcommit漁ると何かあるかも 他のOSSでも似たような事例なかった?

19.

おわり 資料は𝕏の@hogeに置いておきます