@@ -6,18 +6,46 @@ source: |
66 type.inbound
77 // Looking for greenvelope phrasing or indicators in HTML
88 and (
9- strings.icontains(body.current_thread.text, "greenvelope.com")
9+ strings.icontains(body.html.inner_text, "Powered by greenvelope")
10+
1011 // Look for alt text in HTML for standardized greenvelope formatting if string is not avail.
1112 or strings.icontains(body.html.raw, 'alt="Greenvelope"')
1213 or strings.icontains(body.html.raw,
1314 'https://www.greenvelope.com/viewer/envelope.ashx'
1415 )
16+ or strings.icontains(body.current_thread.text, '© 2025 Greenvelope, LLC')
17+ or strings.icontains(body.current_thread.text,
18+ '8 The Green #8901, Dover, DE 19901'
19+ )
1520 )
21+
22+ // no links going to greenvlope cards/"admin" links
23+ and length(filter(body.links,
24+ .href_url.domain.root_domain == "greenvelope.com"
25+ and (
26+ // card links
27+ strings.istarts_with(.href_url.path, '/card/')
28+ // user links are links for the person that created the card
29+ or strings.istarts_with(.href_url.path, '/user/')
30+ )
31+ )
32+ ) == 0
33+
1634 // Legitimate sender will be from greenvelope, negating known non-associated domains.
1735 and not (
18- sender.email.domain.root_domain in ("greenvelope.com")
19- or headers.return_path.domain.root_domain in ("greenvelope.com")
36+ (
37+ sender.email.domain.root_domain in (
38+ "greenvelope.com",
39+ 'greenvelope-email.com'
40+ )
41+ and headers.auth_summary.spf.pass
42+ )
43+ or headers.return_path.domain.root_domain in (
44+ "greenvelope.com",
45+ 'greenvelope-email.com'
46+ )
2047 )
48+
2149 // Capping length to limit FP's
2250 and length(body.current_thread.text) < 1500
2351attack_types :
@@ -31,4 +59,4 @@ detection_methods:
3159id : " 07bf6342-6504-5dc2-b2d7-9a84556fd9d5"
3260og_id : " 9cbbf9b8-a44a-5d86-8caa-3aef898841c1"
3361testing_pr : 3487
34- testing_sha : 04d521242f8107cda620ba8226ff970d051e2237
62+ testing_sha : 3d5f974244663df2dfc5f9bf6a2d6c76f5204ef5
0 commit comments