Detection rules › Kusto
Hunt for compromised browser extensions
This hunting rule can be used to find devices using known compromised browser extensions. It is created based on the threat researched linked in the reference section.
MITRE ATT&CK coverage
| Tactic | Techniques |
|---|---|
| Persistence | T1176 Software Extensions |
References
Rule body yaml
let extensions = datatable (Id:string, VulnVersion:string) [
"nnpnnpemnckcfdebeekibpiijlicmpom", "2.0.1",
"kkodiihpgodmdankclfibbiphjkfdenh", "1.16.2",
"oaikpkmjciadfpddlpjjdapglcihgdle", "1.0.12",
"dpggmcodlahmljkhlmpgpdcffdaoccni", "1.1.1",
"acmfnomgphggonodopogfbmkneepfgnh", "4.00",
"mnhffkhmpnefgklngfmlndmkimimbphc", "4.40",
"cedgndijpacnfbdggppddacngjfdkaca", "0.0.11",
"bbdnohkpnbkdkmnkddobeafboooinpla", "1.0.1",
"egmennebgadmncfjafcemlecimkepcle", "2.2.7",
"bibjgkidgpfbblifamdlkdlhgihmfohh", "0.1.3",
"befflofjcniongenjmbkgkoljhgliihe", "2.13.0",
"pkgciiiancapdlpcbppfkmeaieppikkk", "1.3.7",
"llimhhconnjiflfimocjggfjdlmlhblm", "1.5.7",
"oeiomhmbaapihbilkfkhmlajkeegnjhe", "3.18.0",
"pajkjnmeojmbapicmbpliphjmcekeaac", "24.10.4",
"ndlbedplllcgconngcnfmkadhokfaaln", "2.22.6",
"epdjhgbipjpbbhoccdeipghoihibnfja", "1.4",
"cplhlgabfijoiabgkigdafklbhhdkahj", "1.0.161",
"jiofmdifioeejeilfkpegipdjiopiekl", "1.1.61",
"hihblcmlaaademjlakdpicchbjnnnkbo", "3.0.2",
"llimhhconnjiflfimocjggfjdlmlhblm", "1.5.7",
"ekpkdmohpdnebfedjjfklhpefgpgaaji", "1.3",
"epikoohpebngmakjinphfiagogjcnddm", "2.7.3",
"miglaibdlgminlepgeifekifakochlka", "1.4.5",
"eanofdhdfbcalhflpbdipkjjkoimeeod", "1.4.9",
"ogbhbgkiojdollpjbhbamafmedkeockb", "1.8.1",
"bgejafhieobnfpjlpcjjggoboebonfcg", "1.1.1",
"igbodamhgjohafcenbcljfegbipdfjpk", "2.3",
"mbindhfolmpijhodmgkloeeppmkhpmhc", "1.44",
"hodiladlefdpcbemnbbcpclbmknkiaem", "3.1.3",
"lbneaaedflankmgmfbmaplggbmjjmbae", "1.3.8",
"eaijffijbobmnonfhilihbejadplhddo", "2.4",
"hmiaoahjllhfgebflooeeefeiafpkfde", "1.0.0"
];
DeviceTvmBrowserExtensions
// Find devices using vulnerable extensions
| join kind=inner extensions on $left.ExtensionId == $right.Id
| extend IntVersion = parse_version(ExtensionVersion), IntVulnVursion = parse_version(VulnVersion)
| where IntVersion <= IntVulnVursion and IsActivated == "true"
// Join for more device info
| join kind=inner (
DeviceInfo
| where Timestamp > ago(7d)
) on DeviceId
| distinct DeviceName, DeviceId, BrowserName, ExtensionName, ExtensionDescription, ExtensionVersion, ExtensionRisk, VulnVersion
Stages and Predicates
Let binding: extensions
let extensions = datatable (Id:string, VulnVersion:string) [
"nnpnnpemnckcfdebeekibpiijlicmpom", "2.0.1",
"kkodiihpgodmdankclfibbiphjkfdenh", "1.16.2",
"oaikpkmjciadfpddlpjjdapglcihgdle", "1.0.12",
"dpggmcodlahmljkhlmpgpdcffdaoccni", "1.1.1",
"acmfnomgphggonodopogfbmkneepfgnh", "4.00",
"mnhffkhmpnefgklngfmlndmkimimbphc", "4.40",
"cedgndijpacnfbdggppddacngjfdkaca", "0.0.11",
"bbdnohkpnbkdkmnkddobeafboooinpla", "1.0.1",
"egmennebgadmncfjafcemlecimkepcle", "2.2.7",
"bibjgkidgpfbblifamdlkdlhgihmfohh", "0.1.3",
"befflofjcniongenjmbkgkoljhgliihe", "2.13.0",
"pkgciiiancapdlpcbppfkmeaieppikkk", "1.3.7",
"llimhhconnjiflfimocjggfjdlmlhblm", "1.5.7",
"oeiomhmbaapihbilkfkhmlajkeegnjhe", "3.18.0",
"pajkjnmeojmbapicmbpliphjmcekeaac", "24.10.4",
"ndlbedplllcgconngcnfmkadhokfaaln", "2.22.6",
"epdjhgbipjpbbhoccdeipghoihibnfja", "1.4",
"cplhlgabfijoiabgkigdafklbhhdkahj", "1.0.161",
"jiofmdifioeejeilfkpegipdjiopiekl", "1.1.61",
"hihblcmlaaademjlakdpicchbjnnnkbo", "3.0.2",
"llimhhconnjiflfimocjggfjdlmlhblm", "1.5.7",
"ekpkdmohpdnebfedjjfklhpefgpgaaji", "1.3",
"epikoohpebngmakjinphfiagogjcnddm", "2.7.3",
"miglaibdlgminlepgeifekifakochlka", "1.4.5",
"eanofdhdfbcalhflpbdipkjjkoimeeod", "1.4.9",
"ogbhbgkiojdollpjbhbamafmedkeockb", "1.8.1",
"bgejafhieobnfpjlpcjjggoboebonfcg", "1.1.1",
"igbodamhgjohafcenbcljfegbipdfjpk", "2.3",
"mbindhfolmpijhodmgkloeeppmkhpmhc", "1.44",
"hodiladlefdpcbemnbbcpclbmknkiaem", "3.1.3",
"lbneaaedflankmgmfbmaplggbmjjmbae", "1.3.8",
"eaijffijbobmnonfhilihbejadplhddo", "2.4",
"hmiaoahjllhfgebflooeeefeiafpkfde", "1.0.0"
];
Stage 1: source
DeviceTvmBrowserExtensions
Stage 2: join
| join kind=inner extensions on $left.ExtensionId == $right.Id
Stage 3: extend
| extend IntVersion = parse_version(ExtensionVersion), IntVulnVursion = parse_version(VulnVersion)
Stage 4: where
| where IntVersion <= IntVulnVursion and IsActivated == "true"
Stage 5: join
| join kind=inner (
DeviceInfo
| where Timestamp > ago(7d)
) on DeviceId
Stage 6: distinct
| distinct DeviceName, DeviceId, BrowserName, ExtensionName, ExtensionDescription, ExtensionVersion, ExtensionRisk, VulnVersion
Indicators
Each row is a field, operator, and value that the rule matches. The corpus column counts how many other rules in the catalog look for the same combination: high numbers point to widely-used, community-vetted indicators. Blank or 1 shows that the indicator is specific to this rule.
| Field | Kind | Values |
|---|---|---|
IntVersion | le |
|
IsActivated | eq |
|
Output fields
Fields the rule emits when it matches. Chronicle authors list these in the outcome block; they appear on the detection and $risk_score drives alerting. Sentinel / Defender XDR rules build them up through project / summarize / extend stages. Sentinel maps these into alert fields via entityMappings and customDetails; Defender XDR custom detections surface them as alert fields directly.
| Field | Source |
|---|---|
IntVersion | extend |
IntVulnVursion | extend |