NodeJS Logo

Scannez vos projets NodeJS avec Njsscan

Posted by

Je développe toujours mon jeu en ligne Ellas War durant mon temps libre. Les première versions étaient en PHP et j’ai appris à utiliser NodeJS durant le développement de cette nouvelle version (aussi appelée EWnext). Mon code est loin d’être parfait, mais je pense avoir construit quelque chose de stable et performant.

Ce projet a aussi été l’occasion d’apprendre de nouvelles choses, et la sécurité a toujours été une de mes préoccupations principales. J’isole mes micro-services avec Kubernetes, mais mon code lui-même n’était pas vérifié. La plupart des scanners pour NodeJS détectent les vulnérabilités dans les dépendances, c’est intéressant mais la partie code est aussi importante. Il y a quelques semaines j’ai découvert le projet Njsscan, un projet libre permettant de scanner le code Javascript afin d’en détecter les problèmes. Les informations remontées sont basées sur les recommandations du projet OWASP.

Nous allons utiliser cet outil sur plusieurs de mes projets et commenter les résultats.

Comment l’utiliser ?

Quand j’essaye un nouvel outil, j’essaye d’utiliser Docker. C’est plus facile de l’installer et de gèrer les mises à jour. Un rapport va être généré avec toutes les problèmes détectés et souvent, comment les corriger.

docker pull opensecurity/njsscan:latest
#Allez dans le répertoire de votre projet
docker run -v $(pwd):/src opensecurity/njsscan:latest /src

Analyse du rapport

Le rapport généré regroupe les problèmes par règles, avec des informations complémentaires.

Points positifs

Math.random()

Cette fonction est vulnérable d’un point de vue cryptographique. Je l’utilise principalement dans les combats dans Ellas War, mais c’est toujours intéressant de générer des nombre vraiment aléatoires.

var hash = crypto.createHash('md5').update(string).digest('hex');

Le MD5 est reconnu comme non sûr depuis plusieurs années. Je trouve dommage qu’il n’y ai pas un lien vers des alternatives.

res.redirect(301, '/profile/'+req.query.playerid);

Nous utilisons directement un paramètre obtenu de la part de l’utilisateur afin d’effectuer une redirection. Celui-ci pourrait avoir été vérifié avant, mais je trouve que c’est un bon réflex de ne pas l’utiliser directement.

if(hash == stored_password) {

Cette erreur est je pense la plus intéressante. Les comparaisons directes sont vulnérables aux attaques temporelles. La recommandation est d’utiliser un Xor entre les deux strings et de vérifier si le résultat est bien égal à zéro.

Mauvais points

var sql = 'SELECT username FROM member WHERE id='+id;
var sql; sql = 'SELECT username FROM member WHERE id='+id;

La détection des possibilités d’injections SQL n’est pas fiable du tout. La première ligne sera détectée, mais pas la seconde. Je pense aussi que la source des paramètres n’est pas vérifiée.

var res = {
  'username':''
}

Les valeurs codées en dur sont détectées, mais la plupart du temps la détection est basée sur le nom de la variable. Ici il s’agissait d’une initialisation, pour corriger j’ai utilisé des variables intermédiaires.

Conclusion

Njsscan est un outil intéressant mais pas assez complet pour être indispensable. Je vais continuer de l’utiliser, une bonne sécurité est composée de plusieurs couches. Si vous avez une alternative à me proposez, laissez moi un commentaire.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *