Skip to content

Commit f084664

Browse files
committed
make sure samples are unique
1 parent 6ba9e84 commit f084664

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

aikido_zen/sources/functions/request_handler_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -877,8 +877,8 @@ def test_attack_wave_samples_structure(firewall_lists):
877877
# Get the samples that were stored for this IP
878878
samples = detector.get_samples_for_ip("11.11.11.11")
879879

880-
# Verify samples structure
881-
assert len(samples) == 10 # Should keep last 10 samples
880+
# Verify samples structure - should have only 1 unique sample since all requests are identical
881+
assert len(samples) == 1 # Only 1 unique sample despite 15 identical requests
882882

883883
# Verify each sample has correct structure (method and url only)
884884
for sample in samples:

aikido_zen/vulnerabilities/attack_wave_detection/attack_wave_detector.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,23 @@ def is_attack_wave(self, context: Context) -> bool:
5252
self.suspicious_requests_map.set(ip, suspicious_requests)
5353

5454
samples = self.samples_map.get(ip) or []
55-
samples.append(
56-
{
57-
"method": context.method,
58-
"url": context.url,
59-
}
60-
)
55+
56+
# There's no use in reporting a sample twice.
57+
sample_exists = False
58+
for existing_sample in samples:
59+
if (
60+
existing_sample["method"] == context.method
61+
and existing_sample["url"] == context.url
62+
):
63+
sample_exists = True
64+
break
65+
if not sample_exists:
66+
samples.append(
67+
{
68+
"method": context.method,
69+
"url": context.url,
70+
}
71+
)
6172

6273
# Keep only the most recent samples (limit to avoid memory issues)
6374
if len(samples) > 10:

aikido_zen/vulnerabilities/attack_wave_detection/attack_wave_detector_test.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@ def test_samples_tracking():
136136
for i in range(3):
137137
detector.is_attack_wave(context)
138138

139-
# Check that samples are being tracked
139+
# Check that samples are being tracked (should have only 1 unique sample)
140140
samples = detector.get_samples_for_ip(context.remote_address)
141-
assert len(samples) == 3
142-
assert all(sample["method"] == "POST" for sample in samples)
143-
assert all(sample["url"] == "http://localhost:8080/" for sample in samples)
141+
assert len(samples) == 1 # Only 1 unique sample despite 3 identical requests
142+
assert samples[0]["method"] == "POST"
143+
assert samples[0]["url"] == "http://localhost:8080/"
144144

145145
# Make more requests to exceed the sample limit
146146
for i in range(10):
@@ -164,9 +164,9 @@ def test_clear_samples():
164164
for i in range(5):
165165
detector.is_attack_wave(context)
166166

167-
# Verify samples exist
167+
# Verify samples exist (should have only 1 unique sample)
168168
samples = detector.get_samples_for_ip(context.remote_address)
169-
assert len(samples) == 5
169+
assert len(samples) == 1 # Only 1 unique sample despite 5 identical requests
170170

171171
# Clear samples
172172
detector.clear_samples_for_ip(context.remote_address)

0 commit comments

Comments
 (0)