@@ -6,6 +6,7 @@ import org.evomaster.core.languagemodel.LanguageModelConnector
66import org.evomaster.core.problem.api.param.Param
77import org.evomaster.core.problem.rest.data.RestCallAction
88import org.evomaster.core.problem.rest.data.RestIndividual
9+ import org.evomaster.core.problem.security.data.ActionMapping
910import org.evomaster.core.problem.security.data.ParamMapping
1011import org.evomaster.core.problem.security.verifiers.SSRFVulnerabilityVerifier
1112import 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 }
0 commit comments