IntersectMBO / IntersectMBO/evolution-sdk

blueprint/Codegen: escape blueprint-controlled strings in generated TypeScript

Ouverte
#412 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
bug external-review
Langage dominant
TypeScript
Étoiles
22
Forks
30
Merge moyen
13 h
PR mergées (30 j)
14

Description

## Summary
blueprint/Codegen.ts generateTypeScript() splices blueprint strings into generated
TypeScript without escaping, so a crafted blueprint can inject statements into the
output that run when a consumer builds or imports the generated file. Only reachable
when codegen runs over an untrusted blueprint (e.g. a third party's plutus.json);
self-authored blueprints are unaffected. generateTypeScript returns a string and
executes nothing itself.

## Affected
packages/evolution/src/blueprint/Codegen.ts
- L907 preamble.title in the header JSDoc (`*/` breaks out)
- L1092-1094 validator.title / hash / compiledCode as raw string literals
- L248, L419, L606, L649 constructor tag in TSchema.Literal / TSchema.TaggedStruct
- L286, L448, L525, L600, L645 field title used as an object property name, unquoted
- L959-963, L1018-1023, L1059-1064, L1087-1090 title/description in JSDoc

entry: blueprint/index.ts exports Codegen.generateTypeScript (public via @evolution-sdk/evolution/blueprint).

## Fix
- string literals (title, hash, compiledCode, tag): emit with JSON.stringify, not "${value}".
- property names (field titles): validate as identifier, else quote with JSON.stringify.
- JSDoc (title, description, header): strip `*/`, or drop untrusted strings from comments.

## Regression test
- given: preamble.title = `x */\nglobalThis.__pwned = 1\n/*`, validator title/hash/compiledCode with `"` and a newline
- before: output contains the injected statement outside any comment/string
- after: every value stays inside its intended comment or literal
Must FAIL on main, PASS after the fix.

## Reference
GHSA-79p9-vmph-w58f

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez dans packages/evolution/src/blueprint/Codegen.ts, au niveau de generateTypeScript(), puis examinez les sites d’émission de chaînes, de noms de propriétés et de JSDoc indiqués. Suivez le point d’entrée public via blueprint/index.ts et créez ou exécutez la couverture de régression en utilisant les titres et les valeurs de validator préparés décrits dans l’issue. Le travail est terminé lorsque la sortie générée conserve chaque valeur fournie dans son commentaire, son littéral ou son nom de propriété prévu, et que le test de régression passe.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
security, tooling
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Clairement spécifiée
Accessibilité débutants
72/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.