- 少し前に、SamsungデバイスのJSONインジェクション脆弱性を悪用し、デバイス上でのコード実行にまで至る攻撃チェーンを成立させることができた
- ペイロードのJSONを盲目的に信頼するAPIがどのように悪用されうるかを示す教訓になりうる
あらゆるものに「スマート」にインジェクションする
- Samsung Smart Hubでは、モバイルアプリがハブとリモートで通信し、接続されたあらゆるものを制御できた
- /credentials エンドポイントに悪意あるPOSTリクエストを送ることで、ハブがリモートサーバーへ接続する際に使う認証情報を変更し、データを改ざんしてSQLインジェクションへつなげることができた
- Samsungが依存している json-c ライブラリは JSON_TOKENER_STRICT=0 でコンパイルされており、文字列をシングルクォートとダブルクォートの両方で定義できるようになっていた
- これにより、攻撃者はハブ内部の sqlite データベースに任意の列を作成できた
- camera テーブルに過度に長いROPチェーンを挿入した後、/cameras エンドポイントにDELETEを送ると、video-core プロセスがそのデータを読み取ろうとしてクラッシュし、従来型のスタックベースのバッファオーバーフローを引き起こすことができた
- ここで得られる教訓は、JSONインジェクション → SQLインジェクション → バッファオーバーフロー → ROP = 侵害、ということだった
JSONインジェクションとは何か?
- JSONインジェクションは、悪意あるデータをJSONストリームに挿入することで、アプリケーションの動作を変更したり、意図しない処理を引き起こしたりできる脆弱性
- サーバーサイドのJSONインジェクションは、信頼できないソースからのデータがサーバー側で適切にサニタイズされず、直接または間接的にコードで使われるときに発生する
問題はパーサーにある
- 最新のWebアプリケーションやAPIでは、リクエストパイプライン内で、それぞれ固有の特性と脆弱性を持つ複数のパーサーが使われることがある
- パーサー間の不一致と多段階のリクエスト処理が組み合わさることで、深刻な脆弱性が生じうる
- JSONパーサーは、公式のJSON RFCが重複キーや数値表現のような話題を未確定のまま残しているため、扱いが難しい
- 公式RFCだけが唯一の仕様ではなく、ECMAScript、JSON5、HJSON、Binary JSON(BSON) も存在する
- パーサー間の相互運用性は、多くの人がその存在すら知らないセキュリティリスクを露呈させる
JSONパーサー相互運用性のセキュリティ問題
- 重複キーの扱い方の不一致
- 特殊文字やコメントの扱い方の不一致
- JSONの(逆)シリアライズの不一致
JSONはどう悪用されるのか?
- JSONを操作することで、開発者が想定していない形でアプリケーションが動作するようにデータを注入できる
- APIインフラ内でデータがコンポーネントを通過する方法を操作できると、ビジネスロジックを制御する機会が生まれる
- パーサーが入力をどう処理するかを理解すれば、その挙動を悪用してデータが操作可能な形で解釈されるようにし、入力検証を回避できる
結論
- Samsung Smart Hubへの攻撃は、JSONインジェクションがSQLインジェクションからリモートコード実行に至るまでの複雑な脆弱性チェーンにつながりうる一例にすぎない
- 根本原因は、しばしばJSONパーサー、特に複数の癖のあるパーサーが関与する場合における、データ処理方法の不一致にある
- JSONオブジェクトがどのようにシリアライズ、デシリアライズ、処理されるかを徹底的に調べることで、サニタイズフィルターを回避し、ビジネスロジックに影響を与えられるペイロードの作り方を見つけられる
- APIが引き続き現代のアプリケーションの基盤であり続ける以上、APIがデータを処理する方法の安全性を確保することは、これまで以上に重要である
1件のコメント
JSON bodyで受け取るデータのバリデーションはかなり厳格にやる必要がありそうですね