はじめに
インジェクションの脆弱性は、最も危険で長年にわたるソフトウェアセキュリティの問題の一つです。これらは、信頼できない入力が適切な検証やエスケープなしにクエリ、コマンド、またはコードインタプリタに直接渡されたときに発生します。これにより、不正アクセス、データ破損、またはシステム全体の侵害につながる可能性があります。
従来のSASTツールがJavaScript、Python、Javaなどの一般的な言語に焦点を当てる一方で、AikidoのAIを活用したコード品質エンジンは、Perl、Haskell、Groovy、Erlang、Zig、Delphi、PowerShell、COBOL、ABAP、Visual Basic、Pascal、ColdFusionなど、SASTツールが通常見落とす言語のインジェクション脆弱性を検出できるようになりました。
このルールにより、チームがどの言語を使用しているかに関わらず、安全でないクエリやコマンドの構築が本番環境に到達する前に検出されます。
なぜ重要なのか
インジェクションの脆弱性は、OWASP Top 10のセキュリティリスクの一つであり続けています。
これらは導入は容易ですが、特にレガシー言語やあまり一般的でない言語では、手動レビューによる検出が困難な場合が多いです。
セーフガードがない場合:
- 攻撃者は、動的に構築された文字列にSQLコマンドやOSコマンドを注入できます。
- 機密データが外部に流出したり、破壊されたりする可能性があります。
- コード実行が可能であれば、システム全体が乗っ取られる可能性があります。
このルールを強制することで、クエリやコマンドを構築するすべてのコードは、パラメータ化されたAPI、安全なライブラリ、またはエスケープ関数を使用する必要があり、攻撃対象領域を劇的に削減します。
❌ 非準拠の例
以下にPowerShellでの例を示しますが、同じ問題は多くの言語で発生します。
# 安全でない:ユーザー入力がシステムコマンドに直接連結されています
$userInput = Read-Host "Enter username"
Invoke-Expression ("net user " + $userInput)なぜこれが安全でないのか: Invoke-Expressionは動的に構築されたコマンドを実行します。
攻撃者は「john && del C:\* /Q」と入力し、破壊的な動作を引き起こす可能性があります。
✅ 準拠の例
# Safe: use parameterized or validated command execution
$userInput = Read-Host "Enter username"
if ($userInput -match '^[a-zA-Z0-9_-]+$') {
Start-Process "net" -ArgumentList "user", $userInput
} else {
Write-Host "Invalid input"
}これが安全である理由:
- コマンド引数は連結された文字列ではなく、リストとして渡されます。
- 入力はホワイトリストの正規表現を使用して検証されます。
- 信頼できないデータがエスケープされずにシェルに到達することはありません。
Aikido Securityでお試しください
このルールは、AikidoのCode Qualityツールで直接有効にできます。
有効化されると、ネイティブSASTカバレッジがない言語を含むすべての対応言語で、インジェクションパターンを自動的にスキャンします。
開発者がプルリクエストを開くたびに:
- システムは新規および変更されたコードをレビューします。
- コマンド、クエリ、またはインタープリター呼び出し内での文字列連結や補間の使用をすべてフラグ付けします。
- レポートは正確な行を強調表示し、短い修正提案(例:「パラメータ化されたAPIまたは検証済みの入力を使用する」)を提供します。
このルールはすべてのPRで実行され、多言語リポジトリでも一貫した保護を保証します。
まとめ
動的な文字列構築は、重大なセキュリティ侵害につながる可能性のある最も単純なミスの1つです。
安全でない連結を検出し、安全なクエリ構築プラクティスを強制することで、このルールは本番環境に到達する前にあらゆる種類のインジェクション攻撃を防止します。
言語に関わらず、Aikidoのインテリジェントな分析は、静的保護とAI支援保護を組み合わせることで、従来のツールではカバーできなかった範囲を網羅します。

