Skip to content

Commit b28ad18

Browse files
committed
[backend] Enhance Caldera traces
1 parent 1358f28 commit b28ad18

File tree

2 files changed

+58
-43
lines changed

2 files changed

+58
-43
lines changed

openbas-api/src/main/java/io/openbas/injectors/caldera/CalderaExecutor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public ExecutionProcess process(@NotNull final Execution execution, @NotNull fin
8080
InjectExpectationSignature.builder().type(EXPECTATION_SIGNATURE_TYPE_COMMAND_LINE).value(exploitResult.getCommand()).build()
8181
);
8282
computeExpectationsForAsset(expectations, content, executionEndpoint.getParent(), isInGroup, injectExpectationSignatures);
83-
execution.addTrace(traceInfo("Caldera executed the ability on asset " + asset.getName() + " using " + executionEndpoint.getProcessName() + " (linkID: " + exploitResult.getLinkId() + ")"));
83+
execution.addTrace(traceInfo("Caldera executed the ability on asset " + asset.getName() + " using " + executionEndpoint.getProcessName() + " (paw: " + executionEndpoint.getExternalReference() + ", linkID: " + exploitResult.getLinkId() + ")"));
8484
} else {
8585
execution.addTrace(traceError("Caldera failed to execute the ability on asset " + asset.getName() + " (" + result + ")"));
8686
}

openbas-api/src/main/java/io/openbas/injectors/caldera/service/CalderaResultCollectorService.java

Lines changed: 57 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -59,69 +59,85 @@ public void run() {
5959
List<InjectStatus> injectStatuses = this.injectStatusRepository.pendingForInjectType(CalderaContract.TYPE);
6060
// For each one ask for traces and status
6161
injectStatuses.forEach((injectStatus -> {
62-
log.log(Level.INFO, "Found inject status: " + injectStatus);
62+
log.log(Level.INFO, "Found inject status: " + injectStatus.getId());
6363
// Add traces and close inject if needed.
6464
Instant finalExecutionTime = injectStatus.getTrackingSentDate();
6565
List<String> linkIds = injectStatus.statusIdentifiers();
66-
log.log(Level.INFO, "Found links IDs: " + linkIds);
67-
List<ResultStatus> completedActions = new ArrayList<>();
68-
for (String linkId : linkIds) {
69-
ResultStatus resultStatus = new ResultStatus();
70-
try {
71-
log.log(Level.INFO, "Trying to get result for " + linkId);
72-
resultStatus = this.calderaService.results(linkId);
73-
} catch (Exception e) {
74-
injectStatus.getTraces().add(traceError("Cannot get result for linkID " + linkId + ", injection has failed"));
75-
resultStatus.setFail(true);
76-
completedActions.add(resultStatus);
77-
injectStatus.setTrackingTotalError(injectStatus.getTrackingTotalError() + 1);
78-
}
79-
if (resultStatus.getPaw() == null) {
80-
if (injectStatus.getTrackingSentDate().isBefore(Instant.now().minus(EXPIRATION_TIME / 60, ChronoUnit.MINUTES))) {
66+
if (linkIds.isEmpty()) {
67+
computeInjectStatus(injectStatus, finalExecutionTime, 0, 0);
68+
computeInject(injectStatus);
69+
} else {
70+
log.log(Level.INFO, "Found links IDs: " + linkIds);
71+
List<ResultStatus> completedActions = new ArrayList<>();
72+
for (String linkId : linkIds) {
73+
ResultStatus resultStatus = new ResultStatus();
74+
try {
75+
log.log(Level.INFO, "Trying to get result for " + linkId);
76+
resultStatus = this.calderaService.results(linkId);
77+
} catch (Exception e) {
8178
injectStatus.getTraces().add(traceError("Cannot get result for linkID " + linkId + ", injection has failed"));
79+
log.log(Level.INFO, "Cannot get result for linkID " + linkId + ", injection has failed");
8280
resultStatus.setFail(true);
8381
completedActions.add(resultStatus);
8482
injectStatus.setTrackingTotalError(injectStatus.getTrackingTotalError() + 1);
8583
}
86-
} else {
87-
if (resultStatus.isComplete()) {
88-
completedActions.add(resultStatus);
89-
injectStatus.setTrackingTotalSuccess(injectStatus.getTrackingTotalSuccess() + 1);
90-
// Compute biggest execution time
91-
if (resultStatus.getFinish().isAfter(finalExecutionTime)) {
92-
finalExecutionTime = resultStatus.getFinish();
84+
if (resultStatus.getPaw() == null) {
85+
if (injectStatus.getTrackingSentDate().isBefore(Instant.now().minus(EXPIRATION_TIME / 60, ChronoUnit.MINUTES))) {
86+
injectStatus.getTraces().add(traceError("Cannot get result for linkID " + linkId + ", injection has failed"));
87+
log.log(Level.INFO, "Cannot get result for linkID " + linkId + ", injection has failed");
88+
resultStatus.setFail(true);
89+
completedActions.add(resultStatus);
90+
injectStatus.setTrackingTotalError(injectStatus.getTrackingTotalError() + 1);
91+
}
92+
} else {
93+
if (resultStatus.isComplete()) {
94+
completedActions.add(resultStatus);
95+
if (resultStatus.isFail()) {
96+
injectStatus.setTrackingTotalError(injectStatus.getTrackingTotalError() + 1);
97+
injectStatus.getTraces().add(traceError("Failed result for linkID " + linkId + " (" + resultStatus.getContent() + ")"));
98+
} else {
99+
injectStatus.setTrackingTotalSuccess(injectStatus.getTrackingTotalSuccess() + 1);
100+
injectStatus.getTraces().add(traceInfo("Success result for linkID " + linkId + " (" + resultStatus.getContent() + ")"));
101+
}
102+
// Compute biggest execution time
103+
if (resultStatus.getFinish().isAfter(finalExecutionTime)) {
104+
finalExecutionTime = resultStatus.getFinish();
105+
}
106+
} else if (injectStatus.getTrackingSentDate().isBefore(Instant.now().minus(5L, ChronoUnit.MINUTES))) {
107+
injectStatus.getTraces().add(traceError("Timeout on linkID " + linkId + ", injection has failed"));
108+
log.log(Level.INFO, "Timeout on linkID " + linkId + ", injection has failed");
109+
resultStatus.setFail(true);
110+
completedActions.add(resultStatus);
111+
injectStatus.setTrackingTotalError(injectStatus.getTrackingTotalError() + 1);
93112
}
94-
} else if (injectStatus.getTrackingSentDate().isBefore(Instant.now().minus(5L, ChronoUnit.MINUTES))) {
95-
injectStatus.getTraces().add(traceError("Timeout on linkID " + linkId + ", injection has failed"));
96-
resultStatus.setFail(true);
97-
completedActions.add(resultStatus);
98-
injectStatus.setTrackingTotalError(injectStatus.getTrackingTotalError() + 1);
99113
}
100114
}
101-
}
102-
// Compute status only if all actions are completed
103-
if (!linkIds.isEmpty() && completedActions.size() == linkIds.size()) {
104-
int failedActions = (int) completedActions.stream().filter(ResultStatus::isFail).count();
105-
computeInjectStatus(injectStatus, finalExecutionTime, completedActions.size(), failedActions);
106-
// Update related inject
107-
computeInject(injectStatus);
115+
// Compute status only if all actions are completed
116+
if (completedActions.size() == linkIds.size()) {
117+
int failedActions = (int) completedActions.stream().filter(ResultStatus::isFail).count();
118+
computeInjectStatus(injectStatus, finalExecutionTime, completedActions.size(), failedActions);
119+
// Update related inject
120+
computeInject(injectStatus);
121+
}
108122
}
109123
}));
110124
}
111125

112126
// -- INJECT STATUS --
113127

114-
@Transactional
115128
public void computeInjectStatus(
116129
@NotNull final InjectStatus injectStatus,
117130
@NotNull final Instant finalExecutionTime,
118131
final int completedActions,
119132
final int failedActions) {
120-
boolean hasError = injectStatus.getTraces().stream().anyMatch(trace -> trace.getStatus().equals(ExecutionStatus.ERROR));
121-
injectStatus.setName(hasError ? ExecutionStatus.ERROR : ExecutionStatus.SUCCESS);
122-
injectStatus.getTraces().add(
123-
traceInfo("caldera", "Caldera executed the ability on " + (completedActions - failedActions) + "/" + completedActions + " asset(s)")
124-
);
133+
if (injectStatus.getTraces().stream().filter(injectStatusExecution -> injectStatusExecution.getStatus().equals(ExecutionStatus.ERROR)).count() == completedActions) {
134+
injectStatus.setName(ExecutionStatus.ERROR);
135+
} else if (injectStatus.getTraces().stream().anyMatch(trace -> trace.getStatus().equals(ExecutionStatus.ERROR))) {
136+
injectStatus.setName(ExecutionStatus.PARTIAL);
137+
} else {
138+
injectStatus.setName(ExecutionStatus.SUCCESS);
139+
}
140+
injectStatus.getTraces().add(traceInfo("caldera", "Caldera executed the ability on " + (completedActions - failedActions) + "/" + completedActions + " asset(s)"));
125141
long executionTime = (finalExecutionTime.toEpochMilli() - injectStatus.getTrackingSentDate().toEpochMilli());
126142
injectStatus.setTrackingTotalExecutionTime(executionTime);
127143
injectStatus.setTrackingEndDate(Instant.now());
@@ -130,7 +146,6 @@ public void computeInjectStatus(
130146

131147
// -- INJECT --
132148

133-
@Transactional
134149
public void computeInject(@NotNull final InjectStatus injectStatus) {
135150
Inject relatedInject = injectStatus.getInject();
136151
relatedInject.setUpdatedAt(Instant.now());

0 commit comments

Comments
 (0)