ペンリジェント・ヘッダー

フィルター幻想:JavaScriptフィルター機構の武器化と防御

現代のウェブ開発の原始的なアーキテクチャでは javascriptフィルター 関数(Array.prototype.filter())は、関数型プログラミングの礎石として称賛されている。これにより開発者は、データセットを操作するための宣言的でクリーンなコードを書くことができる。

However, for the adversarial security engineer and the red teamer, the concept of a “filter” in JavaScript represents a dangerous dichotomy. On one side, it is the root cause of widespread クライアント側のアクセス制御 の脆弱性がある。もう一方では、JavaScript言語自体の柔軟性が、フィルター・メソッドを強力な 小道具 ウェブ・アプリケーション・ファイアウォール(WAF)やインプット・サニタイザーをバイパスするため。

本ガイドは、構文を超えたところにある。クライアントサイド・フィルタリングのアーキテクチャ上の失敗を解剖し、攻撃者がコードを実行するために標準ライブラリ・メソッドをどのように武器にしているかを分析し、以下のようなAI駆動型プラットフォームがどのように機能するかを探る。 寡黙 は、こうした微妙な論理的欠陥の発見を自動化している。

javascriptフィルター 寡黙

The Architectural Flaw: The Client-Side JavaScript Filter Trap

に関連する最も広範な脆弱性である。 javascriptフィルター は言語のバグではなく、セキュリティモデルの実装のバグである。シングル・ページ・アプリケーション(SPA)やシック・クライアント(React、Vue、Angular)の時代には、開発者はしばしば、次のようなものを混同してしまう。 プレゼンテーションセキュリティ.

無名による安全保障」パターン

Consider a standard scenario: An API endpoint returns a list of users. The frontend developer needs to display only the active users and hide the administrators to prevent targeting.

ジャバスクリプト

// THE VULNERABLE PATTERN fetch('/api/v1/users') .then(response => response.json()) .then(data => { // Developer uses javascript filter to "secure" the view const visibleUsers = data.filter(user => user.role !== 'admin' && user.status === 'active'); renderTable(visibleUsers); });

一般的なDASTスキャナーにとって、このアプリケーションは安全に見える。UIは管理者データを表示しません。しかし、Burp Suite や単純な DevTools を使うセキュリティ・エンジニアは、真実を知っています。

攻撃のベクトルIDORとPIIリーク

について javascriptフィルター は、信頼されていない環境であるユーザーのブラウザで実行される。ここでの脆弱性は 全データセット は有線で送信された。

搾取のステップ

  1. インターセプト 攻撃者はトラフィックをプロキシする。
  2. 検査しろ: 生のJSONレスポンスには、次のようなオブジェクトが含まれる。 { "id":42, "role":"admin", "pii_ssn":"xxx-xx-xxxx"}.
  3. バイパス: 攻撃者はUIロジックを完全に無視する。

これは データの最小化.適切な実装では、データベース・クエリー・レベル(SQL どこ 節)、機密性の高いバイトがデータセンターを離れることがないようにする。

構文を武器にする:XSSガジェットとしてのJavascriptフィルター

クロスサイト・スクリプティング(XSS)に焦点を移すと、次のようになる。 javascriptフィルター 悪意のあるコードをブロックしようとする防御フィルター(WAFs/Sanitizers)である。

攻撃者は常に "ガジェット "を探している。JavaScriptランタイムの標準的で利用可能なメソッドで、以下のようなブロックリストのキーワードを使わずに任意のコードを実行するために悪用できる。 eval(), 関数()あるいは <スクリプト.

javascriptフィルター 寡黙

コンストラクタ連鎖バイパス

WAFはしばしば、明らかなシンクを探す。しかし、JavaScriptは動的だ。そのため Array.prototype.filter メソッドは関数であり、JavaScriptのすべての関数はコンストラクタを持っている。関数のコンストラクタは 機能 オブジェクトと同様の働きをする。 eval().

WAFがブロックする場合 eval() を使用してペイロードを構築することができる。 フィルター メソッドそのものである。

バイパス・ロジック:

  1. [] は配列を作成する。
  2. [フィルター はフィルター機能にアクセスする。
  3. [コンストラクタ グローバルな 機能 コンストラクタを使用する。
  4. 関数('code')() がコードを実行する。

ペイロード

ジャバスクリプト

`// Standard payload (Blocked by WAF) eval(‘alert(1)’)

// Evasion using javascript filter gadget [].filter.constructor(‘alert(1)’)()`

表:一般的なJavascriptフィルター回避テクニック

テクニックペイロードの構造メカニズムセキュリティ・コンテクスト
コンストラクタの連鎖[].filter.constructor('code')()プロトタイプ・チェーンを使って 機能 コンストラクタを使用する。のキーワードフィルターをバイパスする。 評価.
イテレーターの悪用[].map.constructor('code')()配列のプロトタイプメソッドで動作する。冗長性 フィルター は特に監視されている。
文字列の難読化[].filter['c'+'onstructor']キーワード "constructor" を連結文字列に分割する。正規表現ベースのWAFルールをバイパスする。
ユニコード・エンコーディング\\u0061lert(1)関数名にユニコード・エスケープを使用する。JS parsers decode this; simple filters do not.

フィルタが失敗するときプロトタイプ汚染 (CVE-2019-10744)

オブジェクトをマージする際には、「フィルタリング」の概念が不可欠である。もしアプリケーションがJSON入力を受け入れ、それを既存のオブジェクトにマージする場合、厳密には フィルタリング キーがあれば、プロトタイプ汚染への扉が開かれる。

その最もインパクトのある例のひとつが、次のようなものだ。 CVE-2019-10744 広く使われている ロダッシュ 図書館

脆弱性の解剖

機能 デフォルト・ディープ was designed to merge objects recursively. However, it failed to implement a security filter to reject the コンストラクタ キーだ。

エクスプロイト

攻撃者は、prototypeを指すコンストラクタのプロパティを含むJSONペイロードを提供する。

ジャバスクリプト

const payload = '{"constructor": {"prototype": {"isAdmin": true}}}'; _.defaultsDeep({}, JSON.parse(payload));

インパクト

入力がフィルタリングされなかったため、この代入はベースとなるObject.prototypeを汚染した。突然、JavaScriptランタイムのすべてのオブジェクトがisAdmin: trueプロパティを継承するようになった。

もしアプリケーションに次のような認証ロジックがあったとしたら:

ジャバスクリプト

if (user.isAdmin) { grantAccess(); }.

攻撃者は即座に管理者アクセス権を獲得し、Node.jsのコンテキストに応じてサービス拒否またはRCEを引き起こす。

Automated Logic Discovery: The Penligent Advantage

上記の脆弱性(クライアントサイドフィルタリングとプロトタイプ汚染)は、従来の DAST(動的アプリケーショ ンセキュリティテスト)ツールでは検出が難しいことで有名です。

  • 従来のスキャナー クラッシュ、エラーコード(500)、または単純に反映されたXSS文字列をチェックしてください。彼らは users.filter() は機密データを隠している。
  • AIギャップ: このような問題を見つけるには、以下のことを理解するエンジンが必要です。 コードセマンティクス そして データフロー.

そこで ペンリジェント fundamentally changes the workflow for the security engineer. Penligent utilizes advanced AI Agents that go beyond pattern matching to perform コンテキスト・アウェア分析:

  1. データフロー検査: PenligentはAPIのレスポンスとレンダリングされたDOMを照らし合わせて監視する。API が 50 のフィールドを返したのに、DOM が 5 つしかレンダリングしていない場合、AI は潜在的な可能性を推測する。 javascriptフィルター ロジックに欠陥があり、それをデータ漏洩のリスクとして警告する。
  2. ガジェット世代: Penligentは、XSSペイロードの静的なリストを使用する代わりに、環境で利用可能なオブジェクトに基づいて動的にペイロードを生成します。もし Array.prototype.filter が利用可能だが 評価 がブロックされると、特定の [コンストラクタ バイパスペイロード。

Penligentは、「ハッカーの直感」を自動化することで、セキュリティチームが、通常は手作業によるコードレビューを必要とする深い論理的欠陥を特定することを可能にする。

徹底的な防御:ランタイムのハード化

武器化されたものから身を守る javascriptフィルター ガジェットとロジックの欠陥のために、私たちは重層的な防衛戦略を採用しなければならない。

  1. Server-Side Validation: Never rely on client-side logic for security. Filtering must happen at the database level. Use DTOs (Data Transfer Objects) on the backend to strip sensitive fields before serialization.
  2. Immutable Prototypes:JavaScript To kill an entire class of Prototype Pollution vulnerabilities, freeze the standard object prototypes at application startup. Object.freeze(Object.prototype); Object.freeze(Array.prototype); これにより、たとえ javascriptフィルター が悪意のあるキーをブロックできなかった場合、ランタイムは変更を許可するのではなく、エラーを投げる。
  3. Content Security Policy (CSP): CSP is the ultimate backstop. To prevent the [].filter.constructor exploit, you must disable the execution of strings as code.
    • 推奨されるヘッダー Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none';
    • Crucial: Avoid adding 'unsafe-eval'..なし 'unsafe-eval'によって生成されたコードの実行を拒否します。 機能 コンストラクタでフィルタガジェットを無効にする。

結論

用語 javascriptフィルター は欺瞞に満ちている。若手の開発者にとって、それはユーティリティである。上級のセキュリティ・エンジニアにとっては、情報漏えいをチェックするためのシグナルであり、XSS回避のための小道具であり、入力検証のための重要なチェックポイントなのです。

As modern applications become increasingly complex, leveraging deep architectural understanding combined with AI-driven automation from platforms like 寡黙 が、時代の先端を走り続ける唯一の方法なのだ。

信頼できるリソース

記事を共有する
関連記事