@@ -8,114 +8,118 @@ const { assert } = require('chai')
8
8
describe ( 'ESM Security controls' , ( ) => {
9
9
let axios , sandbox , cwd , appFile , agent , proc
10
10
11
- before ( async function ( ) {
12
- this . timeout ( process . platform === 'win32' ? 90000 : 30000 )
13
- sandbox = await createSandbox ( [ 'express@4' ] ) // TODO: Remove pinning once our tests support Express v5
14
- cwd = sandbox . folder
15
- appFile = path . join ( cwd , 'appsec' , 'esm-security-controls' , 'index.mjs' )
16
- } )
11
+ [ '4' , '5' ] . forEach ( version => {
12
+ describe ( `With express v${ version } ` , ( ) => {
13
+ before ( async function ( ) {
14
+ this . timeout ( process . platform === 'win32' ? 90000 : 30000 )
15
+ sandbox = await createSandbox ( [ `express@${ version } ` ] )
16
+ cwd = sandbox . folder
17
+ appFile = path . join ( cwd , 'appsec' , 'esm-security-controls' , 'index.mjs' )
18
+ } )
17
19
18
- after ( async function ( ) {
19
- await sandbox . remove ( )
20
- } )
20
+ after ( async function ( ) {
21
+ await sandbox . remove ( )
22
+ } )
21
23
22
- const nodeOptions = '--import dd-trace/initialize.mjs'
24
+ const nodeOptions = '--import dd-trace/initialize.mjs'
23
25
24
- beforeEach ( async ( ) => {
25
- agent = await new FakeAgent ( ) . start ( )
26
+ beforeEach ( async ( ) => {
27
+ agent = await new FakeAgent ( ) . start ( )
26
28
27
- proc = await spawnProc ( appFile , {
28
- cwd,
29
- env : {
30
- DD_TRACE_AGENT_PORT : agent . port ,
31
- DD_IAST_ENABLED : 'true' ,
32
- DD_IAST_REQUEST_SAMPLING : '100' ,
33
- // eslint-disable-next-line no-multi-str
34
- DD_IAST_SECURITY_CONTROLS_CONFIGURATION : '\
29
+ proc = await spawnProc ( appFile , {
30
+ cwd,
31
+ env : {
32
+ DD_TRACE_AGENT_PORT : agent . port ,
33
+ DD_IAST_ENABLED : 'true' ,
34
+ DD_IAST_REQUEST_SAMPLING : '100' ,
35
+ // eslint-disable-next-line no-multi-str
36
+ DD_IAST_SECURITY_CONTROLS_CONFIGURATION : '\
35
37
SANITIZER:COMMAND_INJECTION:appsec/esm-security-controls/sanitizer.mjs:sanitize;\
36
38
SANITIZER:COMMAND_INJECTION:appsec/esm-security-controls/sanitizer-default.mjs;\
37
39
INPUT_VALIDATOR:*:appsec/esm-security-controls/validator.mjs:validate' ,
38
- NODE_OPTIONS : nodeOptions
39
- }
40
- } )
40
+ NODE_OPTIONS : nodeOptions
41
+ }
42
+ } )
41
43
42
- axios = Axios . create ( { baseURL : proc . url } )
43
- } )
44
+ axios = Axios . create ( { baseURL : proc . url } )
45
+ } )
44
46
45
- afterEach ( async ( ) => {
46
- proc . kill ( )
47
- await agent . stop ( )
48
- } )
47
+ afterEach ( async ( ) => {
48
+ proc . kill ( )
49
+ await agent . stop ( )
50
+ } )
49
51
50
- it ( 'test endpoint with iv not configured does have COMMAND_INJECTION vulnerability' , async function ( ) {
51
- await axios . get ( '/cmdi-iv-insecure?command=ls -la' )
52
+ it ( 'test endpoint with iv not configured does have COMMAND_INJECTION vulnerability' , async function ( ) {
53
+ await axios . get ( '/cmdi-iv-insecure?command=ls -la' )
52
54
53
- await agent . assertMessageReceived ( ( { payload } ) => {
54
- const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
55
- spans . forEach ( span => {
56
- assert . property ( span . meta , '_dd.iast.json' )
57
- assert . include ( span . meta [ '_dd.iast.json' ] , '"COMMAND_INJECTION"' )
55
+ await agent . assertMessageReceived ( ( { payload } ) => {
56
+ const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
57
+ spans . forEach ( span => {
58
+ assert . property ( span . meta , '_dd.iast.json' )
59
+ assert . include ( span . meta [ '_dd.iast.json' ] , '"COMMAND_INJECTION"' )
60
+ } )
61
+ } , null , 1 , true )
58
62
} )
59
- } , null , 1 , true )
60
- } )
61
63
62
- it ( 'test endpoint sanitizer does not have COMMAND_INJECTION vulnerability' , async ( ) => {
63
- await axios . get ( '/cmdi-s-secure?command=ls -la' )
64
+ it ( 'test endpoint sanitizer does not have COMMAND_INJECTION vulnerability' , async ( ) => {
65
+ await axios . get ( '/cmdi-s-secure?command=ls -la' )
64
66
65
- await agent . assertMessageReceived ( ( { payload } ) => {
66
- const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
67
- spans . forEach ( span => {
68
- assert . notProperty ( span . meta , '_dd.iast.json' )
69
- assert . property ( span . metrics , '_dd.iast.telemetry.suppressed.vulnerabilities.command_injection' )
67
+ await agent . assertMessageReceived ( ( { payload } ) => {
68
+ const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
69
+ spans . forEach ( span => {
70
+ assert . notProperty ( span . meta , '_dd.iast.json' )
71
+ assert . property ( span . metrics , '_dd.iast.telemetry.suppressed.vulnerabilities.command_injection' )
72
+ } )
73
+ } , null , 1 , true )
70
74
} )
71
- } , null , 1 , true )
72
- } )
73
75
74
- it ( 'test endpoint with default sanitizer does not have COMMAND_INJECTION vulnerability' , async ( ) => {
75
- await axios . get ( '/cmdi-s-secure-default?command=ls -la' )
76
+ it ( 'test endpoint with default sanitizer does not have COMMAND_INJECTION vulnerability' , async ( ) => {
77
+ await axios . get ( '/cmdi-s-secure-default?command=ls -la' )
76
78
77
- await agent . assertMessageReceived ( ( { payload } ) => {
78
- const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
79
- spans . forEach ( span => {
80
- assert . notProperty ( span . meta , '_dd.iast.json' )
81
- assert . property ( span . metrics , '_dd.iast.telemetry.suppressed.vulnerabilities.command_injection' )
79
+ await agent . assertMessageReceived ( ( { payload } ) => {
80
+ const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
81
+ spans . forEach ( span => {
82
+ assert . notProperty ( span . meta , '_dd.iast.json' )
83
+ assert . property ( span . metrics , '_dd.iast.telemetry.suppressed.vulnerabilities.command_injection' )
84
+ } )
85
+ } , null , 1 , true )
82
86
} )
83
- } , null , 1 , true )
84
- } )
85
87
86
- it ( 'test endpoint with default sanitizer does have COMMAND_INJECTION with original tainted' , async ( ) => {
87
- await axios . get ( '/cmdi-s-secure-comparison?command=ls -la' )
88
+ it ( 'test endpoint with default sanitizer does have COMMAND_INJECTION with original tainted' , async ( ) => {
89
+ await axios . get ( '/cmdi-s-secure-comparison?command=ls -la' )
88
90
89
- await agent . assertMessageReceived ( ( { payload } ) => {
90
- const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
91
- spans . forEach ( span => {
92
- assert . property ( span . meta , '_dd.iast.json' )
93
- assert . include ( span . meta [ '_dd.iast.json' ] , '"COMMAND_INJECTION"' )
91
+ await agent . assertMessageReceived ( ( { payload } ) => {
92
+ const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
93
+ spans . forEach ( span => {
94
+ assert . property ( span . meta , '_dd.iast.json' )
95
+ assert . include ( span . meta [ '_dd.iast.json' ] , '"COMMAND_INJECTION"' )
96
+ } )
97
+ } , null , 1 , true )
94
98
} )
95
- } , null , 1 , true )
96
- } )
97
99
98
- it ( 'test endpoint with default sanitizer does have COMMAND_INJECTION vulnerability' , async ( ) => {
99
- await axios . get ( '/cmdi-s-secure-default?command=ls -la' )
100
+ it ( 'test endpoint with default sanitizer does have COMMAND_INJECTION vulnerability' , async ( ) => {
101
+ await axios . get ( '/cmdi-s-secure-default?command=ls -la' )
100
102
101
- await agent . assertMessageReceived ( ( { payload } ) => {
102
- const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
103
- spans . forEach ( span => {
104
- assert . notProperty ( span . meta , '_dd.iast.json' )
105
- assert . property ( span . metrics , '_dd.iast.telemetry.suppressed.vulnerabilities.command_injection' )
103
+ await agent . assertMessageReceived ( ( { payload } ) => {
104
+ const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
105
+ spans . forEach ( span => {
106
+ assert . notProperty ( span . meta , '_dd.iast.json' )
107
+ assert . property ( span . metrics , '_dd.iast.telemetry.suppressed.vulnerabilities.command_injection' )
108
+ } )
109
+ } , null , 1 , true )
106
110
} )
107
- } , null , 1 , true )
108
- } )
109
111
110
- it ( 'test endpoint with iv does not have COMMAND_INJECTION vulnerability' , async ( ) => {
111
- await axios . get ( '/cmdi-iv-secure?command=ls -la' )
112
+ it ( 'test endpoint with iv does not have COMMAND_INJECTION vulnerability' , async ( ) => {
113
+ await axios . get ( '/cmdi-iv-secure?command=ls -la' )
112
114
113
- await agent . assertMessageReceived ( ( { payload } ) => {
114
- const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
115
- spans . forEach ( span => {
116
- assert . notProperty ( span . meta , '_dd.iast.json' )
117
- assert . property ( span . metrics , '_dd.iast.telemetry.suppressed.vulnerabilities.command_injection' )
115
+ await agent . assertMessageReceived ( ( { payload } ) => {
116
+ const spans = payload . flatMap ( p => p . filter ( span => span . name === 'express.request' ) )
117
+ spans . forEach ( span => {
118
+ assert . notProperty ( span . meta , '_dd.iast.json' )
119
+ assert . property ( span . metrics , '_dd.iast.telemetry.suppressed.vulnerabilities.command_injection' )
120
+ } )
121
+ } , null , 1 , true )
118
122
} )
119
- } , null , 1 , true )
123
+ } )
120
124
} )
121
125
} )
0 commit comments