現代のウェブ開発の原始的なアーキテクチャでは javascriptフィルター 関数(Array.prototype.filter())は、関数型プログラミングの礎石として称賛されている。これにより開発者は、データセットを操作するための宣言的でクリーンなコードを書くことができる。
しかし、敵対的なセキュリティ・エンジニアにとって、JavaScriptの「フィルター」という概念は危険な二項対立を表している。一方では、広範に存在する クライアント側のアクセス制御 の脆弱性がある。もう一方では、JavaScript言語自体の柔軟性が、フィルター・メソッドを強力な 小道具 ウェブ・アプリケーション・ファイアウォール(WAF)やインプット・サニタイザーをバイパスするため。
本ガイドは、構文を超えたところにある。クライアントサイド・フィルタリングのアーキテクチャ上の失敗を解剖し、攻撃者がコードを実行するために標準ライブラリ・メソッドをどのように武器にしているかを分析し、以下のようなAI駆動型プラットフォームがどのように機能するかを探る。 寡黙 は、こうした微妙な論理的欠陥の発見を自動化している。
アーキテクチャーの欠陥:クライアント側Javascriptフィルター
に関連する最も広範な脆弱性である。 javascriptフィルター は言語のバグではなく、セキュリティモデルの実装のバグである。シングル・ページ・アプリケーション(SPA)やシック・クライアント(React、Vue、Angular)の時代には、開発者はしばしば、次のようなものを混同してしまう。 プレゼンテーション と セキュリティ.
無名による安全保障」パターン
標準的なシナリオを考えてみよう:APIエンドポイントはユーザーのリストを返す。フロントエンド開発者は、アクティブなユーザだけを表示し、管理者を隠す必要がある。
ジャバスクリプト
// 脆弱なパターン
fetch('/api/v1/users')
.then(response => response.json())
.then(data => {)
// 開発者は、javascriptのフィルタを使用して、ビューを "保護 "します。
const visibleUsers = data.filter(user => user.role !== 'admin' && user.status === 'active');
renderTable(visibleUsers);
});
一般的なDASTスキャナーにとって、このアプリケーションは安全に見える。UIは管理者データを表示しません。しかし、Burp Suite や単純な DevTools を使うセキュリティ・エンジニアは、真実を知っています。
攻撃のベクトルIDORとPIIリーク
について javascriptフィルター は、信頼されていない環境であるユーザーのブラウザで実行される。ここでの脆弱性は 全データセット は有線で送信された。
搾取のステップ
- インターセプト 攻撃者はトラフィックをプロキシする。
- 検査しろ: 生のJSONレスポンスには、次のようなオブジェクトが含まれる。
{ "id":42, "role":"admin", "pii_ssn":"xxx-xx-xxxx"}. - バイパス: 攻撃者はUIロジックを完全に無視する。
これは データの最小化.適切な実装では、データベース・クエリー・レベル(SQL どこ 節)、機密性の高いバイトがデータセンターを離れることがないようにする。
構文を武器にする:XSSガジェットとしてのJavascriptフィルター
クロスサイト・スクリプティング(XSS)に焦点を移すと、次のようになる。 javascriptフィルター 悪意のあるコードをブロックしようとする防御フィルター(WAFs/Sanitizers)である。
攻撃者は常に "ガジェット "を探している。JavaScriptランタイムの標準的で利用可能なメソッドで、以下のようなブロックリストのキーワードを使わずに任意のコードを実行するために悪用できる。 eval(), 関数()あるいは <スクリプト.
コンストラクタ連鎖バイパス
WAFはしばしば、明らかなシンクを探す。しかし、JavaScriptは動的だ。そのため Array.prototype.filter メソッドは関数であり、JavaScriptのすべての関数はコンストラクタを持っている。関数のコンストラクタは 機能 オブジェクトと同様の働きをする。 eval().
WAFがブロックする場合 eval() を使用してペイロードを構築することができる。 フィルター メソッドそのものである。
バイパス・ロジック:
[]は配列を作成する。[フィルターはフィルター機能にアクセスする。[コンストラクタグローバルな機能コンストラクタを使用する。関数('code')()がコードを実行する。
ペイロード
ジャバスクリプト
// 標準的なペイロード(WAFによってブロックされる)
eval('alert(1)')
// javascriptフィルタガジェットを使った回避
[].filter.constructor('alert(1)')()

表:一般的なJavascriptフィルター回避テクニック
| テクニック | ペイロードの構造 | メカニズム | セキュリティ・コンテクスト |
| コンストラクタの連鎖 | [].filter.constructor('code')() | プロトタイプ・チェーンを使って 機能 コンストラクタを使用する。 | のキーワードフィルターをバイパスする。 評価. |
| イテレーターの悪用 | [].map.constructor('code')() | 配列のプロトタイプメソッドで動作する。 | 冗長性 フィルター は特に監視されている。 |
| 文字列の難読化 | [].filter['c'+'onstructor'] | キーワード "constructor" を連結文字列に分割する。 | 正規表現ベースのWAFルールをバイパスする。 |
| ユニコード・エンコーディング | \ラート(1) | 関数名にユニコード・エスケープを使用する。 | JavaScriptパーサーはこれを解読するが、単純なフィルターは解読しない。 |
フィルタが失敗するときプロトタイプ汚染 (CVE-2019-10744)
オブジェクトをマージする際には、「フィルタリング」の概念が不可欠である。もしアプリケーションがJSON入力を受け入れ、それを既存のオブジェクトにマージする場合、厳密には フィルタリング キーがあれば、プロトタイプ汚染への扉が開かれる。
その最もインパクトのある例のひとつが、次のようなものだ。 CVE-2019-10744 広く使われている ロダッシュ 図書館
脆弱性の解剖
機能 デフォルト・ディープ はオブジェクトを再帰的にマージするように設計されている。しかし、キーとなる コンストラクタ.
エクスプロイト
攻撃者は、prototypeを指すコンストラクタのプロパティを含むJSONペイロードを提供する。
ジャバスクリプト
const payload = '{"constructor":{"prototype":{"isAdmin": true}}';
_.defaultsDeep({}, JSON.parse(payload));
インパクト
入力がフィルタリングされなかったため、この代入はベースとなるObject.prototypeを汚染した。突然、JavaScriptランタイムのすべてのオブジェクトがisAdmin: trueプロパティを継承するようになった。
もしアプリケーションに次のような認証ロジックがあったとしたら:
ジャバスクリプト
if (user.isAdmin) { grantAccess(); }.
攻撃者は即座に管理者アクセス権を獲得し、Node.jsのコンテキストに応じてサービス拒否またはRCEを引き起こす。
修復: 堅牢な javascriptフィルター オブジェクト・キーはブロック・リストでなければならない __proto__, コンストラクタそして プロトタイプ.
ロジック・ディスカバリーの自動化:ペンリジェント・アプローチ
上記の脆弱性(クライアントサイドフィルタリングとプロトタイプ汚染)は、従来の DAST(動的アプリケーショ ンセキュリティテスト)ツールでは検出が難しいことで有名です。
- 従来のスキャナー クラッシュ、エラーコード(500)、または単純に反映されたXSS文字列をチェックしてください。彼らは
users.filter()は機密データを隠している。 - AIギャップ: このような問題を見つけるには、以下のことを理解するエンジンが必要です。 コードセマンティクス そして データフロー.
そこで ペンリジェント は、セキュリティ・エンジニアのワークフローを根本的に変える。
セマンティック・ファジングと論理解析
Penligentはパターンマッチングを超えた高度なAIエージェントを利用しています。ターゲットアプリケーションを分析する際、Penligentのエンジンは以下を実行します。 コンテキスト・アウェア分析:
- データフロー検査: PenligentはAPIのレスポンスとレンダリングされたDOMを照らし合わせて監視する。API が 50 のフィールドを返したのに、DOM が 5 つしかレンダリングしていない場合、AI は潜在的な可能性を推測する。 javascriptフィルター ロジックに欠陥があり、それをデータ漏洩のリスクとして警告する。
- ガジェット世代: Penligentは、XSSペイロードの静的なリストを使用する代わりに、環境で利用可能なオブジェクトに基づいて動的にペイロードを生成します。もし
Array.prototype.filterが利用可能だが評価がブロックされると、特定の[コンストラクタバイパスペイロード。 - プロトタイプのファジング: AIは、プロトタイプの汚染ベクトルを持つJSONエンドポイントをインテリジェントにファジングし、予期しないプロパティの継承についてアプリケーションの状態を監視し、カスタムコードであってもCVE-2019-10744スタイルの欠陥を特定します。
Penligentは、「ハッカーの直感」を自動化することで、セキュリティチームが、通常は手作業によるコードレビューを必要とする深い論理的欠陥を特定することを可能にする。
徹底的な防御:ランタイムのハード化
武器化されたものから身を守る javascriptフィルター ガジェットとロジックの欠陥のために、私たちは重層的な防衛戦略を採用しなければならない。
1.黄金律サーバーサイドの検証
セキュリティをクライアントサイドのロジックに頼ってはならない。フィルタリングはデータベースレベルで行わなければならない。
- 監査 すべてのAPIエンドポイントをチェックする。ユーザが見ることを許可されたデータのみを返すようにする。 只今.
- DTOである: バックエンドでData Transfer Objectsを使用し、シリアライズの前にセンシティブなフィールドを取り除く。
2.不変のプロトタイプ
プロトタイプ汚染脆弱性のクラス全体を殺すには、アプリケーション起動時に標準オブジェクトのプロトタイプを凍結する。
ジャバスクリプト
// プロトタイプ汚染に対する防御
Object.freeze(Object.prototype);
Object.freeze(Array.prototype);
これにより、たとえ javascriptフィルター が悪意のあるキーをブロックできなかった場合、ランタイムは変更を許可するのではなく、エラーを投げる。
3.コンテンツ・セキュリティ・ポリシー(CSP)
CSPは究極のバックストップだ。を防ぐために [コンストラクタ この場合、文字列をコードとして実行できないようにしなければならない。
推奨されるヘッダー
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';
極めて重要なことだ、 避ける 加算 'unsafe-eval'..なし 'unsafe-eval'によって生成されたコードの実行を拒否します。 機能 コンストラクタでフィルタガジェットを無効にする。
4.DOMPurifyによる入力サニタイズ
自分で正規表現フィルターを書かないでください。簡単にバイパスされてしまいます。使用方法 DOMピュリファイ HTML入力をサニタイズするためのものです。サンドボックスを作成し、HTMLを解析し、厳格な許可リストに基づいて悪意のあるタグ/属性を削除し、XSSがDOMにヒットする前に無効化します。
結論
用語 javascriptフィルター は欺瞞に満ちている。若手の開発者にとって、それはユーティリティである。上級のセキュリティ・エンジニアにとっては、情報漏えいをチェックするためのシグナルであり、XSS回避のための小道具であり、入力検証のための重要なチェックポイントなのです。
最新のアプリケーションがますます複雑化する中、手作業によるテストに頼ってこれらの微妙なロジックの欠陥を発見することは、持続不可能です。深いアーキテクチャー理解と、以下のようなプラットフォームによるAI主導の自動化を組み合わせて活用することで、より効率的なテストが可能になります。 寡黙 が、時代の先端を走り続ける唯一の方法なのだ。

