ORM インジェクション
ORM インジェクション とは何ですか?
ORM インジェクションORM を用いるアプリへのインジェクション攻撃。動的クエリ、Mass Assignment、生 SQL のエスケープ経路を悪用してデータ操作を行う。
ORM インジェクションは、Hibernate、Entity Framework、SQLAlchemy、ActiveRecord、Sequelize、Prisma、Django ORM などのクエリ構築 API に、攻撃者が制御できる入力が動的に入り込むときに発生します。脆弱なパターンとして、HQL/JPQL の文字列連結、ActiveRecord の where(string) への補間、Sequelize の Op.literal、SQLAlchemy のフォーマット文字列を含む text()、想定外属性への Mass Assignment、JSON API の安全でないソート/フィルタ引数などがあります。影響は古典的な SQL インジェクションから、ORM 層に認可ロジックがある場合の権限バイパスや昇格にまで及びます。対策はパラメータ化クエリビルダ、ソート/フィルタ可能列の厳格な許可リスト、明示的な strong parameters、信頼できない入力に対する生 SQL エスケープ経路の不使用です。
● 例
- 01
Rails アプリで User.where("name = '#{params[:q]}'") を呼び出して ORM 経由で SQL インジェクションが発生する。
- 02
Sequelize の端点が攻撃者制御の order パラメータを Op.literal に渡してしまう。
● よくある質問
ORM インジェクション とは何ですか?
ORM を用いるアプリへのインジェクション攻撃。動的クエリ、Mass Assignment、生 SQL のエスケープ経路を悪用してデータ操作を行う。 サイバーセキュリティの 攻撃と脅威 カテゴリに属します。
ORM インジェクション とはどういう意味ですか?
ORM を用いるアプリへのインジェクション攻撃。動的クエリ、Mass Assignment、生 SQL のエスケープ経路を悪用してデータ操作を行う。
ORM インジェクション はどのように機能しますか?
ORM インジェクションは、Hibernate、Entity Framework、SQLAlchemy、ActiveRecord、Sequelize、Prisma、Django ORM などのクエリ構築 API に、攻撃者が制御できる入力が動的に入り込むときに発生します。脆弱なパターンとして、HQL/JPQL の文字列連結、ActiveRecord の where(string) への補間、Sequelize の Op.literal、SQLAlchemy のフォーマット文字列を含む text()、想定外属性への Mass Assignment、JSON API の安全でないソート/フィルタ引数などがあります。影響は古典的な SQL インジェクションから、ORM 層に認可ロジックがある場合の権限バイパスや昇格にまで及びます。対策はパラメータ化クエリビルダ、ソート/フィルタ可能列の厳格な許可リスト、明示的な strong parameters、信頼できない入力に対する生 SQL エスケープ経路の不使用です。
ORM インジェクション からどのように防御しますか?
ORM インジェクション に対する防御は通常、上記の定義で述べたとおり、技術的統制と運用上の実践を組み合わせます。
ORM インジェクション の別名は何ですか?
一般的な別名: HQL インジェクション, JPQL インジェクション。
● 関連用語
- attacks№ 1084
SQL インジェクション
攻撃者が制御する SQL をデータベースクエリに混入させ、データの読み取り・改ざん・破壊を可能にするコードインジェクション攻撃。
- attacks№ 743
NoSQL インジェクション
NoSQL データベースの演算子・JSON・クエリ DSL を改ざんし、ロジックを回避したりデータを抽出したりするインジェクション攻撃。
- attacks№ 1106
ストアドプロシージャ悪用
特権を持つ、または安全に書かれていないストアドプロシージャを悪用し、任意 SQL や OS コマンド実行、データベース層からの権限昇格を行う攻撃。
- vulnerabilities№ 653
マスアサインメント (Mass Assignment)
アプリがクライアントから渡されたフィールドを無検証で内部オブジェクトのプロパティに紐付け、攻撃者が本来制御すべきでない属性を書き換えてしまう脆弱性。
- appsec№ 538
入力検証
アプリケーションが処理する前に、信頼できないすべての入力が期待する型・長さ・範囲・形式・値集合に合致しているかをサーバー側で確認する処理。