メインコンテンツへスキップ

SQLインジェクションの裁判に参加してきた!その衝撃の内容とは

·2 分
2025/02 セキュリティ SQLインジェクション 法律 プログラミング 地方政治

SQLインジェクションの裁判に参加してきた!その衝撃の内容とは

引用元:https://news.ycombinator.com/item?id=43175628

chaps 2025-02-25T19:39:56

みんなこんにちは、私がこの訴訟の原告です。今、tptacekの投稿に関連した記事を作成中です!すぐに準備する予定ですが、その間に質問があれば気軽にどうぞね。待っている間にこの古い投稿もチェックしてみて: https://mchap.io/that-time-the-city-of-seattle-accidentally-

qingcharles 2025-02-26T00:54:58

Matt、君は本当に素晴らしい仕事をしてるよ。でもMattは技術的に負けたこともあるので、特に代表なしで市に対抗するのはとんでもない困難だってことをよく考えてね。法律を変える提案には賛成だよ。イリノイ州ではFOIA法の改正の歴史があるけど、開示の保護を強化する方向の変更も多いから注意が必要だよ。負けた組織には強い罰則が必要だね。イリノイ州では5000ドルの民事罰に制限されてるからね。

tptacek 2025-02-26T01:22:51

負けた公共団体も法的手数料を負担することになるから、かなりの金額になる可能性がある。ただ、公共団体は誰かの金で運営されてるから、本当に警告できるのは、どれだけ彼らの時間を法的行動で食いつぶせるかってところだよ。

dataflow 2025-02-25T23:00:01

カラム名を知っても攻撃者にとって助けにならないという主張が理解できないよ。特にワイルドカードを許可してないデータベースでは、’); SELECT col FROM logins’ができることを知ってれば、カラム名を推測しなくて済むから楽になると思うんだけど。

tczMUFlmoNk 2025-02-25T23:25:11

常にSELECT table_name, column_name, data_type FROM information_schema.columnsを使えるよ。それはSQL標準の一部だからね。
一般的にSQLインジェクションがあれば、試行回数は多いから、1回でロックアウトされることはないよ。’SELECT {id,userid,user_id,uid} FROM {user,users,login,logins,customer,customer}`の全ての組み合わせに限界があるから、役立つ情報を見つけることができると思うよ。

dataflow 2025-02-26T07:44:04

> いつでもSELECT table_name, column_name, data_type FROM information_schema.columnsができるって?私のデータベースは“no such table: information_schema.columns”と言ってるよ。もし私のデータベースがその機能を完全に無効にしてたらどうなるの?
さらに、SQLがここに含まれてるのかな?他のインジェクション“機能”を持つデータベースはスキーマを持ってるはずじゃない?

lyu07282 2025-02-26T08:37:18

> 常にそれができる?今私はそれを試したけど、私のデータベースは“no such table: information_schema.columns”と言ったよ。攻撃者は一度の試みであきらめないよ。使用しているデータベースソフトによって異なるから、最初のステップはSQLiを見つけた後にデータベースソフトを特定することだよ。
もし私のデータベースがこの機能を完全に無効にしてたら?

spoaceman7777 2025-02-26T09:45:51

確かに、様々な方法で無効にできるし、役割やユーザーに応じて設定できるよ。

zachrip 2025-02-25T23:52:27

いいポイントだね、実際に存在しないカラムを選択するユーザーをロックアウトすることでデータベースを強化したことがある人はいるのかな?こうすれば生産に影響してしまうかもしれないが、誰かが君のデータベースでクエリを実行しているなら、それを考慮する価値があると思う。

Waterluvian 2025-02-26T00:17:37

表面的にはすごく魅力的なアイデアだね。まるで“たとえドアを開けっぱなしにしても、君は入るべきじゃない”って感じだね。

default-kramer 2025-02-26T01:20:34

優秀なDBAはアカウントのアクセスを制限して情報スキーマにアクセスできなくするよ。その環境では、DBAはしっかりしてるけどWeb開発者は緩いってのは想像しやすいね。

AdamJacobMuller 2025-02-26T04:08:19

> そして、スキーマとファイルレイアウトに関して、裁判所に反対しないと思う。
法律が“ファイルレイアウト”の開示を禁止するとは思わないけど、スキーマはファイルレイアウトと類似してるから、制限されるのは明らかだね。

tptacek 2025-02-26T04:33:17

SQLスキーマはデータのファイル内の場所を示さないんだ。スキーマはテーブル行とデータを保存するページやインデックス間の関係を切り離すために存在してるからね。だから、スキーマはファイルレイアウトの逆だよ。

dataflow 2025-02-26T07:10:47

> もっと違う言い方をするとさ、
コートにジャケットとシャツのクローゼットがあるって言ったら、衣服の配置方法を教えてることになるよね。これは情報の一部に過ぎないけど。データベースでも同じで、カラムに名前があると、データがどう配置されてるか情報を提供してるわけ。

tptacek 2025-02-26T07:36:55

ファイルレイアウトかそうでないかは明確だよ。「ファイルレイアウトに似てる」って書いたら、それはファイルレイアウトではないとされる。イリノイ州最高裁がそれを誤ってファイルレイアウトと見なしたんだ。

dataflow 2025-02-26T07:53:51

> イリノイ州最高裁が誤ってファイルレイアウトと判断したんだけど、これはメッセージボードの論理を使ったものではなく、技術辞典からの定義を使ったんだ。
その定義が明確にスキーマとファイルレイアウトの違いを示してるなら、もっと良い結果が得られたかもね。

fc417fc802 2025-02-26T10:26:07

> もしあなたの言うことが正しければ、カラム内のアイテムがディスク上で近くに集まると期待してるわけだね。
でもそれは相対的または絶対的なオフセットを与えないし、いろんなことを言い表すわけではないよ。要するに、SQLスキーマは通常の意味ではファイルレイアウトではないってことだね。

dataflow 2025-02-26T10:59:50

> 私の言いたいのは、このカラムにあるアイテムがディスク上で集まりやすいということだよ。
それはファイルレイアウトだね。スキーマは完全ではないが、ファイルレイアウトの情報の一部ではあるのは確かだよ。

HDThoreaun 2025-02-26T05:25:26

“ファイルレイアウト”は、全てのバイトの正確な位置を意味する必要はないよ。抽象的なファイルレイアウトでも、それはファイルレイアウトだ。

dmurray 2025-02-26T00:07:53

> 攻撃者である私がSQLインジェクションを使ってSQLスキーマを回復する。
それは攻撃の結果だけど、目標ではないというのは自らを矛盾させてるよね。スキーマは攻撃者にとって価値がある。

もっとコメントを表示(1)
tptacek 2025-02-26T00:43:30

いろんなものが価値あるけど、それが法律の基準じゃないんだよ。法律に免除されてない限り、開示することがシステムの安全を脅かすって証明するのは公的機関の責任だよ。

hunter2_ 2025-02-26T02:30:47

やっぱりグレーゾーンが広いね。TFAが言う通り、「脅かす」と「脅かす可能性」の違いがあっても、「脅かす」の定義には「危険」が含まれているから、ほとんど関係ないんじゃないかな。

tptacek 2025-02-26T02:51:40

『脅かす』の違いが分析に関係ないってことだよ。何かが人を攻撃するのを助けるわけじゃなくて、そのシステムから得られる価値の一つなら、イリノイ州の法律下では脅かさないんだ。脅かす証明の基準も関係ないよ、そもそも脅かしの主張がないから。

thaumasiotes 2025-02-26T07:25:09

もしも攻撃がシステムを脅かすものじゃないなら、それはイリノイ州の法律では脅かさないっていうのは分かる。でも、スキーマは攻撃者が攻撃を進めるために手に入れるものだから、システムを攻撃する手段になるんだよね。これが攻撃者にとっての価値の全てだよ。

tptacek 2025-02-26T07:40:36

君の主張がわからないよ。SQLIがあればスキーマを取得できるのに、スキーマが事前に公開されても何が問題なの?大切なのはSQLIがあるかどうかじゃないの?

dataflow 2025-02-25T23:45:43

これまだ有効だけど、UIがワイルドカードをサニタイズしたり、データベースがそれを禁止するか、インジェストするまでの時間がないほどのデータが出てしまうと失敗するかもね。

wglb 2025-02-26T02:17:44

サニタイズはほとんど失敗するから、これって武器競争になるよね。

valenterry 2025-02-26T03:34:53

間違えなければ、そうだね。100%のセキュリティはないけど、正直もう2025年だから、SQLインジェクションを防ぐ方法はもう知ってるでしょ。ここに書いたよ:
https://valentin.willscher.de/posts/sql-api/

IshKebab 2025-02-26T07:23:05

そうだけど、想定されるケースは完璧にサニタイズしてるサイトでもまだSQLインジェクションがあるってこと?そんなのありえるの?

dataflow 2025-02-26T08:16:46

でも、ここで想定されているケースは、完璧にサニタイズしたサイトがSQLインジェクションを許すってことだよね?ありえないと思うんだ。アスタリスクが含まれるものは拒否するだけで良いんだし。完璧にする必要はなくて、せめてハードルを設ければいいんだよ。試行回数を現実的に制限するだけで十分だし。

wglb 2025-02-26T18:48:06

そこにパーサーが示されてないから、変な入力の場合がどうなるかは不明だよね。誰かにペネトレーションテストを受けたことある?

valenterry 2025-02-27T03:27:44

まあ、既存のパーサーを選ぶのが普通だと思うよ。特に自分で書く必要はない。大体の言語にはテスト済みのパーサーがあるからね。私の場合、変な入力は拒否されて、ライブラリから”parser error”を受け取って、それを”query not supported”エラーにラップして400を返す感じ。>ペネトレーションテストを受けたことは?実際に受けたよ。ペンテスターたちはその手法に驚いたけど、問題は見つからなかった。

foota 2025-02-25T21:40:00

興味本位なんだけど、”CANVASデータベースの全テーブルから1行のデータを要求する”みたいなことはできるの?

mbreese 2025-02-25T22:12:18

これは人の問題に対する技術的解決策だと思う。市がこの情報を出したくないなら、技術的な解決策は無理だよね。そして、これがすでにイリノイ州最高裁判所に持ち込まれて負けた以上、結局は法の更新が唯一の解決策だよ。

foota 2025-02-25T22:32:44

これは技術的解決策だとはいえ、裁判所が直接スキーマを尋ねられるかどうかを解釈していたんだよね。だから、”スキーマを尋ねることはできないけど、サンプル行を尋ねるのはOK”という選択肢はなかったと思う。

chaps 2025-02-25T22:36:18

短い答えは”はい”、これができる。メールでのリクエストでも、”blah@gov.comの最も最近のメールをください”っていう形でのリクエストが見かけたことがある。で、最終的にはテーブル名を使ってリクエストのバッチを送る計画だった。文法的には、”SELECT * FROM {table_name_from_schema_request} LIMIT 1”みたいな感じで、テーブルごとにFOIAリクエストを出すつもりだった。

doctorpangloss 2025-02-25T19:58:57

CANVASの管理者は何を隠しているんだろう?

chaps 2025-02-25T20:05:39

何とも言えないけど、私がこの訴訟を起こした背景には、シカゴが裏でチケットを処理している業者リストを持っているという情報がある。私がその情報を要求した時には、都市はそんなリストはないと言ったけど、信じている。だから、スキーマ情報があれば本当に彼らが嘘をついているかどうかを確かめられると思った。

9dev 2025-02-25T22:37:53

真剣に聞くんだけど、もし彼らが嘘をついていると疑っているなら、どうしてFOIAリクエストに対して完全なスキーマを出すことを信じるの?おそらく、重要なカラムを省くんじゃない?

SkidanovAlex 2025-02-25T20:23:22

うーん、街がスキーマを公開すべきだとは思うけど、記事の主張には同意できないな。スキーマを知っても攻撃者には役立たないっていうのは間違いなんじゃないかな。攻撃の受け手が特定のテーブルからデータを引き出せるかどうかは、スキーマを知ってるかどうかに依存するんだよね。特に、攻撃者がクエリの失敗とか成功の結果だけを知る場合、スキーマを知ってた方が試行錯誤がしやすくなるんだよ。
攻撃は常に行われているし、失敗したクエリを記録していれば、攻撃を見つけやすくなる可能性もあるし、スキーマを知っているとその弱点を利用しやすくなると思うよ。

もっとコメントを表示(2)
florbnit 2025-02-26T12:11:49

スキーマを知っていると攻撃者にとって有利になることはたくさんあるよ。サービスの名前や市役所にいる公務員の名前、駐車券の法的な説明を知っていることも同様だ。もし訴えられてハッキングを試みるなら、その訴訟の詳細を知るのが役立つのは明らかじゃん。だから、「有益な情報は全部隠すべき」っていうのは違うと思う。

Volundr 2025-02-25T21:51:50

私は攻撃者じゃなくて、ただのソフトウェア開発者だけど、SQLインジェクションがあったらスキーマに関係なくなると思うよ。確かにスキーマを知っていると、完全なインジェクションがなくてもデータを引き出すのに役立つ場面もあったから、スキーマは攻撃者にとって多少有利になるって意見には同意する。

butlike 2025-02-25T22:12:53

そのスキーマを裁判で認めるのは、何かしらの過失を認めることになるんじゃない?スキーマが漏れることがアプリに影響を及ぼす可能性があるなら、ちょっとまずいよね。

default-kramer 2025-02-25T23:05:41

防御についての議論は簡単だよね。SQLインジェクションの穴が無いことを証明するのが難しいから不安だ。

hot_gril 2025-02-26T01:02:13

スキーマがSQLインジェクションの穴を明らかにするとは思えないけど、他の脆弱性を見つける手助けにはなるかもしれないな。例えば、主キーの選択ミスやNULLの扱いなんかがそうかも。
えーっと、NULLを使い過ぎるか、逆に文字列の’NULL’を使ったりするってこと?

default-kramer 2025-02-26T01:17:07

スキーマがSQLインジェクションの穴を明らかにすることは無いよ。ただ、過失の主張が『スキーマはSQLインジェクション穴がない限り無価値』っていうのが前提なのかなと思っただけだ。でも確かに、スキーマを秘密にしておく理由は他にも色々あるよね。

londons_explore 2025-02-26T01:11:36

スキーマはアプリ開発者の考えを知る手掛かりになるから、それを利用して攻撃者はミスが潜んでる部分にたどり着くかもしれないな。

hot_gril 2025-02-26T01:35:10

それは確かにそうだね。

HDThoreaun 2025-02-26T05:32:40

これが市政府の話だから、訴訟の相手方はそのコードを書いたわけじゃないし、全てを確認する暇もない。彼らが知ってるのは、書いたのは猿みたいな奴らだったってことだけだ。それで、コードの中にSQLインジェクションがあるんじゃないかってある程度の根拠を持ってる可能性はあるんだろうね。

pockmarked19 2025-02-25T20:48:23

YouTubeのメール漏洩の脆弱性はスキーマを読むことから始まったって話を思い出すなあ。

robocat 2025-02-25T22:01:23

>$10,000 feels extraordinarily high for a server-side web bugという意見にはちょっと疑問。バグの販売を前提にしてるみたいだけど、YouTubeのユーザーのメールアドレスをスキャンして危険人物に売る方法もあると思う。どれだけのメールが漏洩するかはGoogleしか分からないよね。

pockmarked19 2025-02-25T22:22:12

>I wouldn’t call json a schema。あれはJSON形式でシリアライズされたprotobufだよ。protobuf定義がスキーマじゃないなら何なのかが分からない。

robocat 2025-02-26T07:23:59

うん、訂正ありがとう。

tptacek 2025-02-25T20:35:02

SQLインジェクションを示す失敗したデータベースクエリをログするようにしてるなら、スキーマによってその信号が減ることはないと思うけど。たとえシンタックスエラーが出ても、それは追跡する価値があると思うよ。

kmoser 2025-02-25T21:19:40

スキーマの知識が攻撃者にアドバンテージを与えるのは理解できるよ。カラム名を知ってれば、正しいクエリを作りやすくなるし、失敗したクエリが記録されない可能性もある。

tptacek 2025-02-25T21:28:01

カラム名の知識がどう役立つのかが分からない。SQLインジェクションの脆弱性を見つけるには、実際のクエリを確認しないと意味がない。

kmoser 2025-02-25T23:52:34

カラム名の知識が脆弱性の有無を示すわけじゃなくて、脆弱性があった場合に何ができるかを示すんだよ。例えば、口座残高を1百万にしたいならカラム名が必要だよね。

hot_gril 2025-02-26T00:57:06

SQLインジェクションならスキーマ全体が分かるし、カラム名を事前に知ることの意味があまり分からない。今は非SQLインジェクションの脆弱性について考えてるんだ。

HDThoreaun 2025-02-26T05:35:56

SQLインジェクションはデータベースへのSSHトンネルじゃないから、もし注入した行がセレクトでなくてバックエンドが取得しなければ、カラム名を知っても役に立たない。

hot_gril 2025-02-26T21:11:53

待って、これはブラインドSQLiとして知られているけど、実際にはそこまで盲目的じゃないよ。タイミングを使って情報を一ビットずつ取得できるから、遅いけどDBエラーを引き起こさずにできるんだ。

もっとコメントを表示(3)
HDThoreaun 2025-02-26T21:56:10

人間ってほんとに面白いこと考えるよね。

hot_gril 2025-02-27T05:01:12

そうだね、これはクールなトリックだし、分かりづらいよね。SQLインジェクションでスキーマが取れるって言ったのは、セキュリティコースでの古い記憶を思い出してのことかも。

wglb 2025-02-26T18:57:52

これ、テーブル名を列挙することで実現できるのを見たことある。

hot_gril 2025-02-26T19:59:55

それは一般的な方法だね。ただエラーが通知される可能性もあるし、当然名前が簡単に推測できるわけじゃないから。

hot_gril 2025-02-26T06:14:24

ああ、確かに。記録を見られない可能性もあるよね。

default-kramer 2025-02-25T22:11:56

>コラム名の知識はSQLインジェクションの脆弱性を見分けるのをどう助けるのか?
それはないよ。脆弱性を見つけたら、すぐに有効なクエリを作って、テーブル名やカラムを適当に推測する必要がなくなるから、‘DBクエリ失敗’のアラートを出さずに済むんだ。
編集:ここが私が見逃していた部分なんだ。>脆弱なクエリを一回でブラインド攻撃するには、SQL文自体を見る必要があるって、本当にそうなのか?やったことないから信じるしかないけど、壊れたシステムでは’bobby tables’や1=1 –‘で発見できるかなと思ったけど。

jstanley 2025-02-25T22:34:40

テーブルやカラム名に触れずに有効なクエリも作れるよ。

default-kramer 2025-02-25T23:03:02

そうだね、それを使って脆弱性を見つけるんだ。ただ脆弱性を見つけても、全ての駐車違反を支払い済みに更新する時、スキーマがないと難しくてたくさん失敗するSQLになるよ。スキーマがあれば一発でできるかもしれない。

tptacek 2025-02-25T23:10:06

だから、普通のペンテストの過程では、SQLインジェクションの脆弱性を使ってスキーマ情報を回収することにするんだ。

LegionMammal978 2025-02-25T23:15:01

情報の回復を許さないSQLiの脆弱性ってあるのか?スキーマ回復は常にできるものなのか?GPは、返ってくるシグナルの種類によって難しいこともあると言ってるけど。

tptacek 2025-02-26T00:06:13

自分の体験では、SQLを使ったサイトを何百も調査したけど、スキーマの有無がSQLインジェクションを行う能力に影響したことはない。専門家として、あり得ないシナリオを考えるのは仕事じゃないし、裁判所もその証言を重視しているから、そこは置いておくよ。

hot_gril 2025-02-26T20:57:54

“Blind” SQLiはあるけど、実際の例では完全にブラインドじゃなかった。タイミングで一度に一ビットの情報を取れたから、メールアドレスを見つけ出すことができた。タイミングで情報を得られないケースは想像しにくい。

default-kramer 2025-02-25T23:15:34

ちょっと無知かもしれないけど、アプリのアカウントがinformation_schemaにアクセスできない場合、どうやってやるのよ?

lcnPylGDnU4H9OF 2025-02-26T01:03:40

あまり一般的な設定じゃないと思うけど、自分の無知をさらけ出してるかも。ORMの人気を考えると、スキーマが多くの場合にアプリにロードされるから。

kmoser 2025-02-25T23:56:59

アプリがスキーマを集めようとしたらすぐにロックアウトする賢い設計かもしれない。スキーマを前もって知ってれば、マルウェアの目的を達成するために一発でのインジェクションがしやすくなる。

lucb1e 2025-02-25T22:25:29

>”あなたがスキーマに出来ることはそのフィードのシグナルを減らさない“
例えば、SQLの文法エラーがあれば、どこかにバグがあるページがあるってことだから、追跡する価値はあるよね。このことから、Apacheのエラーログを確認してバグを見つけて直すこともできた。

ethbr1 2025-02-25T22:44:08

>”アプリからのSyntaxエラーはどこかにバグがあることを示す“
これは政府のシステムで、最低入札の請負業者が作ったアプリだと思う。ほとんどの人は、展開されたアプリからの失敗したクエリの量に驚くはず。

lucb1e 2025-02-26T12:59:11

調査する価値があるかは微妙だけど、特定の監視システムがあるか探るよりもFOIAをする方がいいと思う。スキーマは攻撃にとってはあまり関係ないし、それを公開するのも問題ない。

wglb 2025-02-26T02:30:59

>”クエリが失敗した“または”クエリが成功した、データをどうぞ“
Blind SQLインジェクションはエラーを表示しないタイプだけど、成功や失敗を示す微妙なシグナルはある。ある例では、成功したインジェクションは正常なレスポンスのバイト数が一つ多いことがあった。これを使ってスキーマもデータベース全体も引き出せた。

tptacek 2025-02-25T18:50:23

Kurtはこれで俺をからかおうとしてる。ここでの観客は主に非技術系の地元シカゴランドの政治に関わる人たちだってことを知っておいてくれ。地元政治について少し伝えさせてくれ:全国政治に関わるのは厳しくて気が滅入るけど、地元政治は超反応的だ。俺は実際に法を通すこともできたし、ほとんど費用をかけずに暇な時間に実現できたんだ(全国政治とは大違いだよ)。地元政治のすごいところは、フォーラムが中心になってるところだ。場所はあまり行きたくないところ(特にFacebookグループとか)だけど、参加することを楽しむなら、政治にも参加できるし、フォーラムを活用して実際に物事を成し遂げることができるんだ。

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。