Skip to content

Commit df66c25

Browse files
committed
fixing unknown asn system
1 parent d455b7c commit df66c25

File tree

3 files changed

+57
-21
lines changed

3 files changed

+57
-21
lines changed

bbot/core/helpers/asn.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ def __init__(self, parent_helper):
2121

2222
# Default record used when no ASN data can be found
2323
UNKNOWN_ASN = {
24-
"asn": "UNKNOWN",
25-
"subnet": "0.0.0.0/32",
24+
"asn": "0",
25+
"subnets": [],
2626
"name": "unknown",
2727
"description": "unknown",
2828
"country": "",

bbot/modules/report/asn.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class asn(BaseReportModule):
1818

1919
async def setup(self):
2020
self.unknown_asn = {
21-
"asn": "UNKNOWN",
22-
"subnet": "0.0.0.0/32",
23-
"name": "unknown",
24-
"description": "unknown",
25-
"country": "",
21+
"asn": "0",
22+
"subnets": [],
23+
"asn_name": "unknown",
24+
"org": "unknown",
25+
"country": "unknown",
2626
}
2727
# Track ASN data locally instead of relying on cache
2828
self.asn_data = {} # ASN number -> ASN record mapping
@@ -78,20 +78,22 @@ async def handle_event(self, event):
7878
self.processed_subnets[subnet] = asn_number
7979

8080
emails = asn_record.get("emails", [])
81-
asn_event = self.make_event(asn_number, "ASN", parent=event)
82-
if asn_event:
83-
await self.emit_event(
84-
asn_event,
85-
context=f"{{module}} looked up {event.data} and got {{event.type}}: AS{asn_number} ({asn_name}, {asn_desc}, {asn_country})",
86-
)
81+
# Don't emit ASN 0 - it's reserved and indicates unknown ASN data
82+
if asn_number != "0":
83+
asn_event = self.make_event(int(asn_number), "ASN", parent=event)
84+
if asn_event:
85+
await self.emit_event(
86+
asn_event,
87+
context=f"{{module}} looked up {event.data} and got {{event.type}}: AS{asn_number} ({asn_name}, {asn_desc}, {asn_country})",
88+
)
8789

88-
for email in emails:
89-
await self.emit_event(
90-
email,
91-
"EMAIL_ADDRESS",
92-
parent=asn_event,
93-
context=f"{{module}} retrieved details for AS{asn_number} and found {{event.type}}: {{event.data}}",
94-
)
90+
for email in emails:
91+
await self.emit_event(
92+
email,
93+
"EMAIL_ADDRESS",
94+
parent=asn_event,
95+
context=f"{{module}} retrieved details for AS{asn_number} and found {{event.type}}: {{event.data}}",
96+
)
9597

9698
async def report(self):
9799
"""Generate an ASN summary table based on locally tracked ASN data."""
@@ -105,7 +107,7 @@ async def report(self):
105107
header = ["ASN", "Subnet Count", "Name", "Description", "Country"]
106108
table = []
107109
for asn, data in sorted_asns:
108-
number = "AS" + asn if asn != "UNKNOWN" else asn
110+
number = "AS" + asn if asn != "0" else asn
109111
table.append(
110112
[
111113
number,

bbot/test/test_step_2/module_tests/test_module_asn.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,37 @@ def check(self, module_test, events):
3939

4040
# Verify ASN number is a valid integer
4141
assert any(isinstance(e.data, int) and e.data > 0 for e in asn_events)
42+
43+
44+
class TestASNUnknownHandling(ModuleTestBase):
45+
"""Test ASN module behavior when API returns no data, leading to UNKNOWN_ASN usage."""
46+
47+
targets = ["8.8.8.8"] # Use known public IP but mock response to test unknown ASN handling
48+
module_name = "asn"
49+
modules_overrides = ["asn"]
50+
config_overrides = {"scope": {"report_distance": 2}}
51+
52+
async def setup_after_prep(self, module_test):
53+
# Point ASNHelper to local test harness
54+
from bbot.core.helpers.asn import ASNHelper
55+
56+
module_test.monkeypatch.setattr(ASNHelper, "asndb_ip_url", "http://127.0.0.1:8888/v1/ip/")
57+
58+
# Mock API to return 404 (no ASN data found)
59+
expect_args = {"method": "GET", "uri": "/v1/ip/8.8.8.8"}
60+
respond_args = {
61+
"response_data": "Not Found",
62+
"status": 404,
63+
"content_type": "text/plain",
64+
}
65+
module_test.set_expect_requests(expect_args=expect_args, respond_args=respond_args)
66+
67+
def check(self, module_test, events):
68+
# When API returns 404, ASN helper should return UNKNOWN_ASN with string "0"
69+
# but NO ASN events should be emitted since ASN 0 is reserved
70+
asn_events = [e for e in events if e.type == "ASN"]
71+
72+
# Should NOT emit any ASN events when ASN data is unknown
73+
assert not asn_events, (
74+
f"Should not emit any ASN events for unknown ASN data, but found: {[e.data for e in asn_events]}"
75+
)

0 commit comments

Comments
 (0)