Les attaques contre la chaîne d'approvisionnement constituent un gros problème pour l'écosystème JavaScript. Dans ce court article, je présenterai une mesure de sécurité simple qui peut être implémentée par tous les environnements d'exécution JavaScript, à la fois dans le navigateur et hors navigateur. Cela empêchera la plupart des attaques de la chaîne d’approvisionnement qui ravagent aujourd’hui l’écosystème JavaScript.
Voici un incident récent au cours duquel des sites Web ont été piratés :
Le cœur du problème est que les modules JavaScript héritent des autorisations de l'application ou du module qui les a appelés. Il s'agit d'un problème à la fois pour les exécutions dans le navigateur et hors navigateur.
Ce problème est encore compliqué par le fait que la version du module dont dépend une application peut changer à l'insu de l'auteur de l'application. Ainsi, même si les codes de toutes les dépendances ont été minutieusement révisés (ce qui représente un énorme effort en soi), cet effort sera vain si les versions des dépendances n'ont pas été verrouillées.
Pourquoi ne pas verrouiller les versions et utiliser des dépendances basées sur Semver ? Eh bien, c'est principalement parce que si un éditeur de module publie des corrections de bugs, il est préférable d'utiliser le code corrigé. Et c'est l'une des principales raisons pour lesquelles les CDN JavaScript tels que esm.sh prennent en charge les semvers.
Les navigateurs Web sont des environnements d'exécution en bac à sable, donc un module JavaScript tiers (3JM) importé par un site Web ne peut causer aucun dommage à l'appareil de l'utilisateur final.
Néanmoins, un 3JM peut utiliser les ressources de calcul de l'appareil et émettre des requêtes réseau pour le minage de Bitcoin, etc., sans le consentement du site Web.
Certains environnements d'exécution hors navigateur tels que Deno implémentent des mesures pour restreindre les autorisations accordées à une application JavaScript/TypeScript. Mais ces mesures échouent pour les raisons suivantes :
Actuellement, les équipes de sécurité ont mis en place des processus automatisés pour rechercher des vulnérabilités dans les modules publiés sur des registres bien connus tels que NPM. Cette mesure de sécurité présente plusieurs défauts :
Pour résoudre ces problèmes, je propose un nouveau système d'autorisations par module qui est rétrocompatible avec le fonctionnement actuel des applications JS/TS.
Cela implique une nouvelle configuration d'autorisations facultatives que chaque application et module peut déclarer dans leurs fichiers deno.json / deno.jsonc / package.json. les autorisations comportent 2 parties :
Voici comment les autorisations seraient utilisées par le runtime JS/TS :
La valeur des autorisations ressemblerait à ceci :
{ "self": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "imports": { "jsr:@org/module@1.0.0": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "https://cdn.example/org/module@1.0.0": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} }, "[default]": { "read": {"allow": [], "deny": []}, "write": {"allow": [], "deny": []}, "net": {"allow": [], "deny": []}, "env": {"allow": [], "deny": []}, "run": {"allow": [], "deny": []} } } }
Par rapport à la solution actuelle, la solution que je propose présente plusieurs avantages :
Cela semble très simple. Aucune modification n'est requise dans les langages JS/TS. Et si la configuration des autorisations est absente, alors nous revenons à la situation actuelle où l'application et son graphe de dépendances ont tous les autorisations qui ont été fournies par les arguments de ligne de commande ∎
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!