Skip to content

Commit 369c959

Browse files
committed
basic functional code of va
1 parent 2f6c148 commit 369c959

4 files changed

Lines changed: 59 additions & 13 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.evomaster.core.problem.security
2+
3+
enum class ParameterType {
4+
BODY,
5+
6+
HEADER
7+
}

core/src/main/kotlin/org/evomaster/core/problem/security/VulnerabilityAnalyser.kt

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.evomaster.core.languagemodel.LanguageModelConnector
66
import org.evomaster.core.problem.api.param.Param
77
import org.evomaster.core.problem.rest.data.RestCallAction
88
import org.evomaster.core.problem.rest.data.RestIndividual
9+
import org.evomaster.core.problem.security.data.ActionMapping
910
import org.evomaster.core.problem.security.data.ParamMapping
1011
import org.evomaster.core.problem.security.verifiers.SSRFVulnerabilityVerifier
1112
import org.evomaster.core.search.EvaluatedIndividual
@@ -32,7 +33,7 @@ class VulnerabilityAnalyser {
3233
*/
3334
private lateinit var ssrfVerifier: SSRFVulnerabilityVerifier
3435

35-
private var actionVulnerabilityMapping: MutableMap<String, MutableMap<String, ParamMapping>> = mutableMapOf()
36+
private var actionVulnerabilityMapping: MutableMap<String, ActionMapping> = mutableMapOf()
3637

3738
/**
3839
* Individuals in the solution.
@@ -110,9 +111,11 @@ class VulnerabilityAnalyser {
110111
individualsInSolution.forEach { evaluatedIndividual ->
111112
val ea = evaluatedIndividual.evaluatedMainActions()[0].action
112113
if (ea is RestCallAction) {
113-
val descriptions : MutableMap<String, ParamMapping> = extractBodyParameterDescriptions(ea.getName(), ea.parameters)
114+
val actionMapping = ActionMapping(ea.getName())
115+
val paramMapping: MutableMap<String, ParamMapping> =
116+
extractBodyParameters(ea.parameters)
114117

115-
descriptions.forEach { paramName, description ->
118+
paramMapping.forEach { paramName, description ->
116119
val answer = if (!description.description.isNullOrBlank()) {
117120
languageModelConnector.query(
118121
ssrfVerifier.getPromptWithNameAndDescription(
@@ -128,20 +131,24 @@ class VulnerabilityAnalyser {
128131
)
129132
}
130133

131-
if (answer == SSRFVulnerabilityVerifier.SSRF_PROMPT_ANSWER_FOR_POSSIBILITY)
134+
if (answer == SSRFVulnerabilityVerifier.SSRF_PROMPT_ANSWER_FOR_POSSIBILITY) {
132135
description.addVulnerabilityClass(VulnerabilityClass.SSRF)
136+
actionMapping.isVulnerable = true
137+
}
133138
}
134139

135-
actionVulnerabilityMapping[ea.getName()] = descriptions
140+
// Assign the param mapping
141+
actionMapping.paramMapping = paramMapping
142+
143+
actionVulnerabilityMapping[ea.getName()] = actionMapping
136144
}
137145
}
138146
}
139147

140148
/**
141149
* Extract descriptions from the Gene of body payloads.
142150
*/
143-
private fun extractBodyParameterDescriptions(
144-
name: String,
151+
private fun extractBodyParameters(
145152
parameters: List<Param>
146153
): MutableMap<String, ParamMapping> {
147154
val output = mutableMapOf<String, ParamMapping>()
@@ -151,11 +158,15 @@ class VulnerabilityAnalyser {
151158
param.seeGenes().forEach { gene ->
152159
if (gene.name == "body") {
153160
gene.getAllGenesInIndividual().forEach { geneInIndividual ->
154-
output[geneInIndividual.name] =
155-
ParamMapping(geneInIndividual.name, geneInIndividual.description)
161+
val pm = ParamMapping(geneInIndividual.name, geneInIndividual.description)
162+
pm.paramType = ParameterType.BODY
163+
output[geneInIndividual.name] = pm
164+
156165
}
157166
} else {
158-
output[gene.name] = ParamMapping(gene.name, gene.description)
167+
val pm = ParamMapping(gene.name, gene.description)
168+
pm.paramType = ParameterType.HEADER
169+
output[gene.name] = pm
159170
}
160171
}
161172
}
@@ -174,8 +185,11 @@ class VulnerabilityAnalyser {
174185
individualsInSolution.forEach { evaluatedIndividual ->
175186
val ea = evaluatedIndividual.evaluatedMainActions()[0].action as RestCallAction
176187
// Execute only the action which marked as a possible candidate
177-
if (actionVulnerabilityMapping.containsKey(ea.getName())) {
178-
val link = ssrfVerifier.generateLink(ea.getName())
188+
if (actionVulnerabilityMapping.containsKey(ea.getName())
189+
&& actionVulnerabilityMapping.getValue(ea.getName()).isVulnerable
190+
) {
191+
val honeyPotLink = ssrfVerifier.generateLink(ea.getName())
192+
// TODO: Execute the tests here
179193
}
180194
}
181195
}
@@ -189,10 +203,11 @@ class VulnerabilityAnalyser {
189203
if (config.problemType == EMConfig.ProblemType.REST) {
190204
individualsInSolution.forEach { eI ->
191205
val ea = eI.evaluatedMainActions()[0].action as RestCallAction
206+
val am = actionVulnerabilityMapping[ea.getName()]
192207
val result = ssrfVerifier.verify(ea.getName())
193208

194209
if (result) {
195-
// TODO: Mark as vulnerable
210+
am?.isExploitable = true
196211
}
197212
}
198213
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.evomaster.core.problem.security.data
2+
3+
import org.evomaster.core.problem.security.VulnerabilityClass
4+
5+
class ActionMapping (
6+
val name: String,
7+
8+
) {
9+
10+
var paramMapping: Map<String, ParamMapping> = mutableMapOf()
11+
12+
var isVulnerable = false
13+
14+
var isExploitable = false
15+
16+
var vulnerabilityClasses: MutableList<VulnerabilityClass> = mutableListOf()
17+
18+
fun addVulnerabilityClass(vulnerabilityClass: VulnerabilityClass) {
19+
vulnerabilityClasses.add(vulnerabilityClass)
20+
}
21+
}

core/src/main/kotlin/org/evomaster/core/problem/security/data/ParamMapping.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.evomaster.core.problem.security.data
22

3+
import org.evomaster.core.problem.security.ParameterType
34
import org.evomaster.core.problem.security.VulnerabilityClass
45

56
class ParamMapping (
@@ -9,6 +10,8 @@ class ParamMapping (
910

1011
var promptId : String? = null
1112

13+
var paramType: ParameterType? = null
14+
1215
var vulnerabilityClasses: MutableList<VulnerabilityClass> = mutableListOf()
1316

1417
fun addVulnerabilityClass(vulnerabilityClass: VulnerabilityClass) {

0 commit comments

Comments
 (0)