Skip to content

Siemphony is in beta and still being built. How a rule earns its badge.

Siemphony’s repertoire

Zone identifier stream naming a locally assembled download source

AN0872 points at Sysmon EventID 15 and the Zone.Identifier stream a browser or mail client stamps onto a file it delivered, and specifically at the HostUrl and ReferrerUrl values recorded inside it. A file fetched over the network carries the server it came from; a file that HTML smuggling assembled inside the page from a JavaScript Blob or a Data URL never crossed the network as a file, so the browser has no source to record and writes about:internet, about:blank, or the blob: or data: URL itself. This rule pairs that origin marker with MITRE's DroppedFileExtensionWatchlist knob, populated here with the executable, script, shortcut, installer and container types a smuggled payload arrives as, because the marker alone also appears on every client-side export a web application generates. The drop-then-execute half of the analytic — the dropped file running a few minutes after the HTML was opened — is a correlation Sigma cannot express and is not attempted, and a payload written to a path Sysmon is not watching produces no event at all. Two configuration prerequisites: EventID 15 is not emitted by a bare Sysmon install and most shipped configurations restrict stream hashing to a short extension list, and the Contents field carrying the URL values exists only on Sysmon 13.10 and later, so on an older agent this rule parses cleanly and can never fire. UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0313, not hand-written and not tested by its author. Any lab result is on this rule's own page.Full description

The detection

The 3 SIEM queries below are previews produced by Siemphony’s own translator, not pySigma, and none has been executed against a real backend — review before you deploy.

detection.yml

title: Zone identifier stream naming a locally assembled download sourceid: 40bb1b65-b5ea-43df-bfee-28782cf1fa24status: experimentaldescription: |  AN0872 points at Sysmon EventID 15 and the Zone.Identifier stream a browser or  mail client stamps onto a file it delivered, and specifically at the HostUrl  and ReferrerUrl values recorded inside it. A file fetched over the network  carries the server it came from; a file that HTML smuggling assembled inside  the page from a JavaScript Blob or a Data URL never crossed the network as a  file, so the browser has no source to record and writes about:internet,  about:blank, or the blob: or data: URL itself. This rule pairs that origin  marker with MITRE's DroppedFileExtensionWatchlist knob, populated here with the  executable, script, shortcut, installer and container types a smuggled payload  arrives as, because the marker alone also appears on every client-side export a  web application generates. The drop-then-execute half of the analytic — the  dropped file running a few minutes after the HTML was opened — is a correlation  Sigma cannot express and is not attempted, and a payload written to a path  Sysmon is not watching produces no event at all. Two configuration  prerequisites: EventID 15 is not emitted by a bare Sysmon install and most  shipped configurations restrict stream hashing to a short extension list, and  the Contents field carrying the URL values exists only on Sysmon 13.10 and  later, so on an older agent this rule parses cleanly and can never fire.  UNVERIFIED AS AUTHORED — derived from MITRE ATT&CK DET0313, not hand-written and not tested by its author. Any lab result is on this rule's own page.references:  - https://attack.mitre.org/techniques/T1027/006  - https://attack.mitre.org/detectionstrategies/DET0313author: Siemphony pipeline (machine-derived from MITRE ATT&CK v19.2)date: 2026-08-16tags:  - attack.defense-evasion  - attack.t1027.006logsource:  category: create_stream_hash  product: windowsdetection:  selection_zone_stream:    TargetFilename|endswith:      - '.exe:Zone.Identifier'      - '.dll:Zone.Identifier'      - '.msi:Zone.Identifier'      - '.scr:Zone.Identifier'      - '.pif:Zone.Identifier'      - '.hta:Zone.Identifier'      - '.js:Zone.Identifier'      - '.jse:Zone.Identifier'      - '.vbs:Zone.Identifier'      - '.vbe:Zone.Identifier'      - '.wsf:Zone.Identifier'      - '.ps1:Zone.Identifier'      - '.bat:Zone.Identifier'      - '.cmd:Zone.Identifier'      - '.lnk:Zone.Identifier'      - '.iso:Zone.Identifier'      - '.img:Zone.Identifier'      - '.vhd:Zone.Identifier'      - '.vhdx:Zone.Identifier'      - '.zip:Zone.Identifier'      - '.rar:Zone.Identifier'      - '.7z:Zone.Identifier'  selection_local_origin:    Contents|contains:      - 'HostUrl=about:internet'      - 'HostUrl=about:blank'      - 'HostUrl=blob:'      - 'HostUrl=data:'      - 'ReferrerUrl=blob:'      - 'ReferrerUrl=data:'  condition: selection_zone_stream and selection_local_originfalsepositives:  - "Web applications that build a download in the browser instead of serving it, where a reporting console, an admin portal or a password manager packages files into a .zip client-side with a JavaScript Blob and the HTML5 download attribute. That is the same mechanism the technique abuses and produces the same origin marker, so it is the loudest benign match here and the reason the level is not higher."  - "Browser extensions and download managers that hand finished bytes to the page rather than letting the browser fetch the URL, so a saved installer or archive is written with no originating host recorded."  - "Mail, chat and collaboration clients saving an attachment to disk, which apply the internet zone without any HTTP source of their own; an .iso or .zip attachment saved out of a webmail session matches on the extension list for exactly that reason."  - "Phishing simulation platforms, security awareness training and detection validation suites that deliver a genuine HTML smuggling sample on purpose, producing a real match for every user who opens the exercise."level: medium

Splunk · SPL

Run this as a search.

index=* ((TargetFilename="*.exe:Zone.Identifier" OR TargetFilename="*.dll:Zone.Identifier" OR TargetFilename="*.msi:Zone.Identifier" OR TargetFilename="*.scr:Zone.Identifier" OR TargetFilename="*.pif:Zone.Identifier" OR TargetFilename="*.hta:Zone.Identifier" OR TargetFilename="*.js:Zone.Identifier" OR TargetFilename="*.jse:Zone.Identifier" OR TargetFilename="*.vbs:Zone.Identifier" OR TargetFilename="*.vbe:Zone.Identifier" OR TargetFilename="*.wsf:Zone.Identifier" OR TargetFilename="*.ps1:Zone.Identifier" OR TargetFilename="*.bat:Zone.Identifier" OR TargetFilename="*.cmd:Zone.Identifier" OR TargetFilename="*.lnk:Zone.Identifier" OR TargetFilename="*.iso:Zone.Identifier" OR TargetFilename="*.img:Zone.Identifier" OR TargetFilename="*.vhd:Zone.Identifier" OR TargetFilename="*.vhdx:Zone.Identifier" OR TargetFilename="*.zip:Zone.Identifier" OR TargetFilename="*.rar:Zone.Identifier" OR TargetFilename="*.7z:Zone.Identifier") AND (Contents="*HostUrl=about:internet*" OR Contents="*HostUrl=about:blank*" OR Contents="*HostUrl=blob:*" OR Contents="*HostUrl=data:*" OR Contents="*ReferrerUrl=blob:*" OR Contents="*ReferrerUrl=data:*"))

Elastic · ES|QL

Run this as a search.

FROM logs-*| WHERE ((TO_LOWER(file.path) LIKE "*.exe:zone.identifier" OR TO_LOWER(file.path) LIKE "*.dll:zone.identifier" OR TO_LOWER(file.path) LIKE "*.msi:zone.identifier" OR TO_LOWER(file.path) LIKE "*.scr:zone.identifier" OR TO_LOWER(file.path) LIKE "*.pif:zone.identifier" OR TO_LOWER(file.path) LIKE "*.hta:zone.identifier" OR TO_LOWER(file.path) LIKE "*.js:zone.identifier" OR TO_LOWER(file.path) LIKE "*.jse:zone.identifier" OR TO_LOWER(file.path) LIKE "*.vbs:zone.identifier" OR TO_LOWER(file.path) LIKE "*.vbe:zone.identifier" OR TO_LOWER(file.path) LIKE "*.wsf:zone.identifier" OR TO_LOWER(file.path) LIKE "*.ps1:zone.identifier" OR TO_LOWER(file.path) LIKE "*.bat:zone.identifier" OR TO_LOWER(file.path) LIKE "*.cmd:zone.identifier" OR TO_LOWER(file.path) LIKE "*.lnk:zone.identifier" OR TO_LOWER(file.path) LIKE "*.iso:zone.identifier" OR TO_LOWER(file.path) LIKE "*.img:zone.identifier" OR TO_LOWER(file.path) LIKE "*.vhd:zone.identifier" OR TO_LOWER(file.path) LIKE "*.vhdx:zone.identifier" OR TO_LOWER(file.path) LIKE "*.zip:zone.identifier" OR TO_LOWER(file.path) LIKE "*.rar:zone.identifier" OR TO_LOWER(file.path) LIKE "*.7z:zone.identifier") AND (TO_LOWER(winlog.event_data.Contents) LIKE "*hosturl=about:internet*" OR TO_LOWER(winlog.event_data.Contents) LIKE "*hosturl=about:blank*" OR TO_LOWER(winlog.event_data.Contents) LIKE "*hosturl=blob:*" OR TO_LOWER(winlog.event_data.Contents) LIKE "*hosturl=data:*" OR TO_LOWER(winlog.event_data.Contents) LIKE "*referrerurl=blob:*" OR TO_LOWER(winlog.event_data.Contents) LIKE "*referrerurl=data:*"))

Wazuh · XML rule

Deploy to your manager — this is a rule, not a search.

<group name="sigma,windows,create_stream_hash,">  <!-- Rule ids must be unique on your manager; 100000+ is the user range. -->  <rule id="100000" level="7">    <!-- Set <if_sid> to the decoder/base rule for windows so this only evaluates relevant events. -->    <field name="TargetFilename" type="pcre2">(?i)(\.exe:Zone\.Identifier$|\.dll:Zone\.Identifier$|\.msi:Zone\.Identifier$|\.scr:Zone\.Identifier$|\.pif:Zone\.Identifier$|\.hta:Zone\.Identifier$|\.js:Zone\.Identifier$|\.jse:Zone\.Identifier$|\.vbs:Zone\.Identifier$|\.vbe:Zone\.Identifier$|\.wsf:Zone\.Identifier$|\.ps1:Zone\.Identifier$|\.bat:Zone\.Identifier$|\.cmd:Zone\.Identifier$|\.lnk:Zone\.Identifier$|\.iso:Zone\.Identifier$|\.img:Zone\.Identifier$|\.vhd:Zone\.Identifier$|\.vhdx:Zone\.Identifier$|\.zip:Zone\.Identifier$|\.rar:Zone\.Identifier$|\.7z:Zone\.Identifier$)</field>    <field name="Contents" type="pcre2">(?i)(HostUrl=about:internet|HostUrl=about:blank|HostUrl=blob:|HostUrl=data:|ReferrerUrl=blob:|ReferrerUrl=data:)</field>    <description>Zone identifier stream naming a locally assembled download source</description>    <mitre>      <id>T1027.006</id>    </mitre>  </rule></group>

Sentinel · KQL

Run this as a search.

Sentinel cannot express this construct. No Sentinel table is modelled for this logsource ({"category":"create_stream_hash","product":"windows"}), so there is nothing honest to query. Pick a logsource this translator maps, or write the KQL by hand. The Sigma source is on the first tab, unchanged.

Verdicts · reactions · comments

Community

Verdicts from engineers who actually deployed it, and the conversation around it.

Log in to react
Not yet reported on

Nobody has run this in a real environment and said what happened.

Verdicts from engineers who deployed it

0 cast

No verdicts reported yet. The first one is worth more than the tenth — say what you ran it against.

Log in to report a verdict.

Log in to join the discussion.

No comments yet. Someone who deploys this will have something to say about it.