First Commit
ci / go (push) Waiting to run
ci / go-db (agent) (push) Waiting to run
ci / go-db (config) (push) Waiting to run
ci / go-db (db) (push) Waiting to run
ci / go-db (evidence) (push) Waiting to run
ci / go-db (llmrec) (push) Waiting to run
ci / go-db (server) (push) Waiting to run
web / web (push) Waiting to run
docs / links (push) Canceled after 0s
detections / detections (push) Canceled after 0s

This commit is contained in:
dela
2026-10-09 08:38:16 +08:00
commit 0335d572de
756 changed files with 201663 additions and 0 deletions
+124
View File
@@ -0,0 +1,124 @@
# ARTEX 탐지 규칙 (Sigma / 호스트·로그·SIEM)
한국어 · [English](README.md)
이 디렉터리는 ARTEX 탐지 묶음에서 호스트·로그·SIEM 계층을 맡습니다. 여기 실린
[Sigma](https://sigmahq.io) 규칙은 방어 가이드([한국어](../../docs/defense-ko.md) ·
[English](../../docs/defense-en.md)) 4절의 의사 규칙을 벤더 중립 형식으로 정식화한 것이고, 각자의
SIEM·EDR 질의 언어로 변환해 씁니다. 모든 지표는 추정이 아니라 이 저장소 소스에서 실제로 확인한
문자열이나 행동에 근거합니다. 네트워크 계층은 [`../suricata/`](../suricata/)에 있고, ATT&CK 레이어와
지표 CSV·MISP 내보내기, 호스트 분류 스크립트를 포함한 전체 탐지 묶음은
[`../README.ko.md`](../README.ko.md)가 색인합니다. 모든 규칙은 자신이 소유하거나 서면 허가를 받은
시스템을 지키는 **방어·탐지 목적에만** 사용하십시오.
## 원자(atomic) 규칙
규칙 하나가 관측 가능한 사실 하나에 대응합니다. 개별로 변환해도 되고, 트리 전체의 일부로 변환해도
됩니다.
- **[`artex_enrich_user_agent.yml`](artex_enrich_user_agent.yml)**: *ARTEX Asset Enrichment Probe
User-Agent*. 자산 보강(`enrich/enrich.go`)이 보내는 인바운드 `artex-enrich/1.0` User-Agent 입니다.
대상 측에서 관측하는 보조 지표입니다. `level: high`.
- **[`artex_selfupdate_egress.yml`](artex_selfupdate_egress.yml)**: *ARTEX Self-Update Egress
User-Agent*. 자가 업데이트 루틴(`selfupdate/github.go`)이 내보내는 아웃바운드 `artex-selfupdate`
User-Agent 입니다. 호스트·포렌식 egress 지표입니다. `level: medium`.
- **[`artex_guard_audit_framing.yml`](artex_guard_audit_framing.yml)**: *ARTEX Platform Guard
Audit-Log Framing*. 도구 호출이 차단될 때 감사 로그에 기록되는 플랫폼 가드 통제 마커입니다
(`guard/guard.go`). 호스트·포렌식 지표입니다. `level: high`.
- **[`artex_recording_proxy_ca.yml`](artex_recording_proxy_ca.yml)**: *ARTEX Recording-Proxy MITM CA
Certificate Artifact*. 기록 프록시가 `_ca/mitmproxy-ca-cert.pem` 배치로 생성하는 MITM CA 파일입니다
(`traffic/traffic.go`). 호스트·포렌식 산출물이며, 파일명 자체는 단독 실행 mitmproxy 와도 공유되므로
사냥 단서(hunting lead)로 취급합니다. `level: medium`.
- **[`destructive_command_hunting.yml`](destructive_command_hunting.yml)**: *Destructive Command
Execution (ARTEX Guard-List Hunting)*. ARTEX 가드의 내장 거부 목록(`db/db.go` 시드)을 반영한 파괴적
셸·DB 명령입니다. ARTEX 고유 시그니처가 **아니라** 일반 사냥 단서입니다. `level: medium`.
## 상관(correlation) 규칙 (행동 기반) · [`correlation/`](correlation/)
정적 문자열은 바꿀 수 있지만 행동은 숨기기가 더 어렵습니다. 이 Sigma **상관** 규칙들은 방어 가이드
4.1~4.2절과 4.4절의 행동 기반 계층을 정식화합니다. 각 규칙은 위의 원자 규칙 하나를 `id` 로 참조하므로,
상관 파일 하나가 아니라 **`sigma/` 트리 전체를 변환해야** 참조가 풀립니다([Sigma 테스트](../tests/sigma/)가
바로 이 의존 관계를 단언합니다).
- **[`correlation/artex_enrich_scan_velocity.yml`](correlation/artex_enrich_scan_velocity.yml)**:
*Enrichment Scan Velocity*. 한 출처가 짧은 창 안에 `artex-enrich/1.0` 프로브를 몰아치는 경우입니다
(보강은 동시성 4로, 속도 제한 없이 돕니다). 단건 규칙이 놓치는 속도를 잡습니다. `event_count`,
`level: high`.
- **[`correlation/artex_enrich_fanout.yml`](correlation/artex_enrich_fanout.yml)**: *Enrichment
Fan-Out*. 한 출처가 보강 User-Agent 를 서로 다른 여러 호스트로 퍼뜨리는 경우입니다. 요청량이 아니라
접촉한 서로 다른 호스트 수가 신호이며, 자산 목록을 기계 속도로 훑는 폭을 잡습니다. `value_count`,
`level: high`.
- **[`correlation/artex_guard_block_burst.yml`](correlation/artex_guard_block_burst.yml)**:
*Guard-Block Burst*. 한 호스트에서 플랫폼 가드 통제 마커가 반복되는 경우입니다. 마커를 인용만 한
문서가 아니라, 실제로 가동 중인 ARTEX 실행이 자기 가드를 건드리는 상황을 가리킵니다. `event_count`,
`level: high`.
- **[`correlation/artex_guard_marker_then_destructive.yml`](correlation/artex_guard_marker_then_destructive.yml)**:
*Guard Marker With Destructive Command*. 가드 마커와 파괴적 명령이 한 호스트에서 한 창 안에 함께
나타나는 경우입니다(방어 가이드 4.2절, 다단계). ARTEX 고유 마커를 원래 일반적인 파괴적 명령 신호와
결합하므로 특이도가 올라갑니다. `temporal`, `level: high`.
임계값과 창은 보수적인 기본값이므로, 자신의 기준선에 맞게 조정하십시오. 순수 웹 다단계 경우(열거 →
프로빙 → 인증)는 여전히 환경별 기본 규칙이 필요합니다. 그 패턴은 ARTEX 고유 User-Agent 하나로
환원되지 않기 때문입니다. 시작점으로 쓸 일반 행동 기반 기본 템플릿은 [방어 가이드 4.2절](../../docs/defense-ko.md)에
있으며, ARTEX 소스에 근거를 둘 수 없어 이 검증된 트리에서는 의도적으로 뺐습니다.
## 범위와 정직함: 배포 전에 읽으십시오
- **정적 지표는 바꿀 수 있습니다.** 운영자가 User-Agent 를 바꾸거나 CA 파일을 지울 수 있으므로, 원자
지표가 없다고 해서 안전하다는 뜻은 **아닙니다**. 오래가는 신호는 `correlation/` 규칙이 기준으로 삼는
행동입니다. 한 출처가 정찰에서 열거, 프로빙, 인증·주입 시도로 이어 가며, 응답에 적응하고, 쉬지 않고
도는 흐름이 그것입니다.
- **파괴적 명령 규칙은 일반 사냥입니다.** ARTEX 가드 거부 목록을 반영하지만, 같은 명령을 정당한
관리자도 실행합니다. 적중은 단서로 다루고, 자신의 환경을 허용 목록으로 걸러 내며, 그것만으로 ARTEX
라고 단정하지 마십시오.
- **포트와 스키마는 네트워크가 아니라 호스트 포렌식입니다.** 서버 기본 포트 `:8787` 과 기록 프록시
`127.0.0.1:8788`(`cmd/artex/main.go`), 그리고 PostgreSQL 탐색 그래프 스키마는 의심 호스트에서 직접
확인하는 편이 낫습니다. 그래서 시끄러운 규칙 대신 [지표 CSV](../indicators/)와
[호스트 분류 스크립트](../triage/)로 제공합니다.
- **`logsource` 와 필드명은 일반값입니다.** 규칙은 일반 `category`·`product` 로그 소스와 필드명
(`cs-user-agent`, `CommandLine`, `TargetFilename`)을 씁니다. 변환 시 파이프라인(`-p`)으로 자신의
제품 스키마에 매핑하십시오. 아래 백엔드 설명을 참조하십시오.
## 검증과 변환
[sigma-cli](https://github.com/SigmaHQ/sigma-cli)(pySigma)로 검증했습니다. 저장소 루트에서 실행합니다.
```sh
python3 -m venv .venv && . .venv/bin/activate
pip install sigma-cli
# 구조 + 모범 사례 검증 (기대: 0 errors, 0 issues)
sigma check detections/sigma/
# 이 규칙 세트의 문서화된 기준선으로 SigmaHQ 관례 전체를 검사 (기대: 0 issues)
pip install pySigma-validators-sigmahq
sigma check --validation-config detections/tests/sigma_lint/validators.yml detections/sigma/
# 상관 규칙이 참조하는 원자 규칙을 풀 수 있도록 트리 전체를 변환
sigma plugin install splunk
sigma convert -t splunk --without-pipeline detections/sigma/
```
백엔드마다 상관 규칙 지원이 다르므로 `-t` 선택이 중요합니다. Splunk, Elasticsearch EQL, Grafana Loki 는
트리 전체를 변환하고, Elasticsearch Lucene, OpenSearch, 마이크로소프트 `kusto` 백엔드는 원자 규칙
다섯 개만 변환합니다(창은 제품에서 네이티브로 표현합니다). 백엔드별 실측 표와 `--without-pipeline` ·
`-p` 필드 매핑 설명은 [`../README.ko.md`](../README.ko.md)에 있고,
[`../tests/sigma_backends/`](../tests/sigma_backends/)가 재현합니다.
## 테스트
[`../tests/`](../tests/) 아래 재현 가능한 네 스위트가 이 규칙들을 다루며, 각각 Docker 만 있으면 됩니다.
[`sigma/`](../tests/sigma/)는 검증과 트리 전체 컴파일, 그리고 상관 규칙이 단독으로는 변환에 실패함을
단언하고, [`sigma_match/`](../tests/sigma_match/)는 규칙이 악성 샘플에 실제로 발화하고 양성 샘플에는
침묵하는지 확인하며, [`sigma_backends/`](../tests/sigma_backends/)는 백엔드 다섯 종의 이식성을,
[`sigma_lint/`](../tests/sigma_lint/)는 SigmaHQ 검증기 기준선 전체(0 issues)를 확인합니다.
[`../tests/README.ko.md`](../tests/README.ko.md)를 참조하십시오.
## 기여
탐지 기여를 환영합니다. 새 규칙은 모든 지표를 관측 가능한 사실에 근거해 두고, 한계를 `description` 에
밝히며, SigmaHQ 검증기 기준선을 깨끗이 통과하고
(`sigma check --validation-config ../tests/sigma_lint/validators.yml .`), 공격 안내로 읽히는 내용을
담지 않아야 합니다. [`../../CONTRIBUTING.md`](../../CONTRIBUTING.md)와
[`../suricata/`](../suricata/)의 네트워크 계층, 그리고 [`../README.ko.md`](../README.ko.md)를
참조하십시오.
+127
View File
@@ -0,0 +1,127 @@
# ARTEX detection rules (Sigma / host · log · SIEM)
English · [한국어](README.ko.md)
> 한국어: 이 디렉터리는 [방어·탐지 가이드(docs/defense-ko.md)](../../docs/defense-ko.md) 4절
> "탐지 규칙"의 의사 규칙을 실제로 배포 가능한 [Sigma](https://sigmahq.io) 규칙으로 옮긴 것입니다.
> 네트워크 계층은 [`../suricata/`](../suricata/)가 담당합니다. 모든 규칙은 자신이 소유하거나 서면
> 허가를 받은 시스템을 지키는 **방어·탐지 목적에만** 사용하십시오. 한국어 전체 문서는
> **[README.ko.md](README.ko.md)** 를, 전체 탐지 묶음 개요는 **[../README.ko.md](../README.ko.md)** 를 보십시오.
The host, log, and SIEM layer of the ARTEX detection set. These [Sigma](https://sigmahq.io) rules
formalize the pseudo-rules in the defense guide ([Korean](../../docs/defense-ko.md) ·
[English](../../docs/defense-en.md), section 4) into a vendor-neutral format you convert to your own
SIEM or EDR query language. Every indicator is grounded in a string or behaviour verified in this
repository's source, not inferred. The network layer lives under [`../suricata/`](../suricata/); the
full detection set — the ATT&CK coverage layer, the indicator CSV / MISP export, and the host-triage
script — is indexed in [`../README.md`](../README.md).
## Atomic rules
One rule, one observable fact. Convert them individually or as part of the whole tree.
- **[`artex_enrich_user_agent.yml`](artex_enrich_user_agent.yml)** — *ARTEX Asset Enrichment Probe
User-Agent*. Inbound `artex-enrich/1.0` User-Agent from asset enrichment (`enrich/enrich.go`).
Target-side, supporting indicator. `level: high`.
- **[`artex_selfupdate_egress.yml`](artex_selfupdate_egress.yml)** — *ARTEX Self-Update Egress
User-Agent*. Outbound `artex-selfupdate` User-Agent from the self-update routine
(`selfupdate/github.go`). Host/forensic egress indicator. `level: medium`.
- **[`artex_guard_audit_framing.yml`](artex_guard_audit_framing.yml)** — *ARTEX Platform Guard
Audit-Log Framing*. The platform-guard control marker written to the audit log on a blocked tool
call (`guard/guard.go`). Host/forensic indicator. `level: high`.
- **[`artex_recording_proxy_ca.yml`](artex_recording_proxy_ca.yml)** — *ARTEX Recording-Proxy MITM CA
Certificate Artifact*. Creation of the recording proxy's MITM CA file under the
`_ca/mitmproxy-ca-cert.pem` layout (`traffic/traffic.go`). Host/forensic artifact; the bare filename
is shared with standalone mitmproxy, so it is a hunting lead. `level: medium`.
- **[`destructive_command_hunting.yml`](destructive_command_hunting.yml)** — *Destructive Command
Execution (ARTEX Guard-List Hunting)*. Destructive shell/DB commands mirroring the ARTEX guard's
built-in deny list (`db/db.go` seed). Generic hunting lead, **not** an ARTEX signature. `level: medium`.
## Correlation rules (behaviour) — [`correlation/`](correlation/)
Static strings can be changed; behaviour is harder to hide. These Sigma **correlation** rules encode the
behaviour-based layer of the defense guide (sections 4.1–4.2 and 4.4). Each references an atomic rule
above by its `id`, so **convert the whole `sigma/` tree, not a single correlation file**, or the
reference will not resolve (the [Sigma test](../tests/sigma/) asserts exactly this dependency).
- **[`correlation/artex_enrich_scan_velocity.yml`](correlation/artex_enrich_scan_velocity.yml)** —
*Enrichment Scan Velocity*. A burst of `artex-enrich/1.0` probes from one source in a short window
(enrichment runs at concurrency 4 with no rate limit) — the velocity the single-request rule misses.
`event_count`, `level: high`.
- **[`correlation/artex_enrich_fanout.yml`](correlation/artex_enrich_fanout.yml)** — *Enrichment
Fan-Out*. One source carrying the enrichment User-Agent to many *distinct* hosts: machine-speed breadth
across an asset list, where the distinct-host count, not request volume, is the tell. `value_count`,
`level: high`.
- **[`correlation/artex_guard_block_burst.yml`](correlation/artex_guard_block_burst.yml)** —
*Guard-Block Burst*. Repeated platform-guard control markers on one host — an actively engaged ARTEX
run tripping its own guard, not a document that merely quotes the marker. `event_count`, `level: high`.
- **[`correlation/artex_guard_marker_then_destructive.yml`](correlation/artex_guard_marker_then_destructive.yml)**
— *Guard Marker With Destructive Command*. The guard marker and a destructive command co-occurring on
one host within a window (defense guide §4.2, multi-stage): combining an ARTEX-specific marker with the
otherwise-generic destructive-command signal raises specificity. `temporal`, `level: high`.
Thresholds and windows are conservative defaults — tune them to your baseline. The pure web multi-stage
case (enumerate → probe → authenticate) still needs base rules specific to your environment, because that
pattern does not reduce to a single ARTEX-unique User-Agent; a generic behavioural base template to start
from is in the [defense guide §4.2](../../docs/defense-en.md), kept out of this tested tree because it
cannot be grounded in ARTEX source.
## Scope and honesty — read before deploying
- **Static indicators can be changed.** An operator can set a different User-Agent or clean up the CA
file, so the absence of an atomic indicator does **not** mean safety. The durable signal is the
behaviour the `correlation/` rules key on — one source chaining recon → enumeration → probing →
auth/injection attempts, adapting to responses, running without pause.
- **The destructive-command rule is generic hunting.** It mirrors ARTEX's guard deny list, but the same
commands are run by legitimate administrators. Treat a hit as a lead, allow-list your environment, and
do not attribute it to ARTEX on its own.
- **Ports and schema are host-forensic, not Sigma.** The server default `:8787` and recording proxy
`127.0.0.1:8788` (`cmd/artex/main.go`), and the PostgreSQL exploration-graph schema, are best checked on
a suspected host, so they ship in the [indicator CSV](../indicators/) and the
[host-triage script](../triage/) rather than as noisy rules.
- **`logsource` and field names are generic.** The rules use generic `category`/`product` log sources and
field names (`cs-user-agent`, `CommandLine`, `TargetFilename`). Map them to your product's schema with a
pipeline (`-p`) at convert time; see the backend notes below.
## Validate and convert
Validated with [sigma-cli](https://github.com/SigmaHQ/sigma-cli) (pySigma). From the repository root:
```sh
python3 -m venv .venv && . .venv/bin/activate
pip install sigma-cli
# structural + best-practice validation (expect: 0 errors, 0 issues)
sigma check detections/sigma/
# full SigmaHQ convention set with this rule set's documented baseline (expect: 0 issues)
pip install pySigma-validators-sigmahq
sigma check --validation-config detections/tests/sigma_lint/validators.yml detections/sigma/
# compile the WHOLE tree so the correlation rules resolve the atomic rules they reference by id
sigma plugin install splunk
sigma convert -t splunk --without-pipeline detections/sigma/
```
Backends vary in correlation support, so the `-t` choice matters: Splunk, Elasticsearch EQL, and Grafana
Loki convert the whole tree, while Elasticsearch Lucene, OpenSearch, and the Microsoft `kusto` backend
convert the five atomic rules only (express the window natively in the product). The measured per-backend
matrix and the `--without-pipeline` / `-p` field-mapping notes are in [`../README.md`](../README.md), and
they are reproduced by [`../tests/sigma_backends/`](../tests/sigma_backends/).
## Tests
Four reproducible suites under [`../tests/`](../tests/) cover these rules, each needing only Docker:
[`sigma/`](../tests/sigma/) (validation, whole-tree compilation, and that a correlation rule fails to
convert alone), [`sigma_match/`](../tests/sigma_match/) (the rules actually fire on malicious samples and
stay quiet on benign ones), [`sigma_backends/`](../tests/sigma_backends/) (portability across five
backends), and [`sigma_lint/`](../tests/sigma_lint/) (the full SigmaHQ validator baseline, 0 issues). See
[`../tests/README.md`](../tests/README.md).
## Contributing
Detection contributions are welcome. New rules should keep every indicator grounded in an observable fact,
state limitations in the `description`, pass the SigmaHQ validator baseline cleanly
(`sigma check --validation-config ../tests/sigma_lint/validators.yml .`), and avoid any content that reads
as attack guidance. See [`../../CONTRIBUTING.en.md`](../../CONTRIBUTING.en.md) and the network layer in
[`../suricata/`](../suricata/) / [`../README.md`](../README.md).
@@ -0,0 +1,31 @@
title: ARTEX Asset Enrichment Probe User-Agent
id: 34adfa15-1696-4322-afc0-f69988e9cc1e
status: experimental
description: |
Detects inbound HTTP requests whose User-Agent is "artex-enrich/1.0", set by the ARTEX
autonomous penetration-testing framework when it auto-enriches assets (DNS/HTTP checks)
and reads a target's <title>. This probe is generated by ARTEX itself, independent of the
LLM: it does not follow redirects, disables keep-alive, and reads only the beginning of the
response. Default concurrency is 4, so several assets may be probed at once. An operator can
change this User-Agent, so its ABSENCE does not imply safety. Treat it as a supporting
indicator and combine it with the behaviour-based detection in the defense guide, section 4.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-05
tags:
- attack.reconnaissance
- attack.t1595
- attack.t1592
logsource:
category: webserver
detection:
selection:
cs-user-agent: 'artex-enrich/1.0'
condition: selection
falsepositives:
- Unlikely; this User-Agent string is specific to the ARTEX enrichment client, but an
operator who changed it will not be caught here.
level: high
@@ -0,0 +1,27 @@
title: ARTEX Platform Guard Audit-Log Framing
id: 3add497e-36cb-47c4-8993-df8f98585ef7
status: experimental
description: |
Detects the control-framing string the ARTEX platform guard writes to its audit log when it
blocks a tool call. Blocked calls are recorded with a message beginning with the literal
marker shown below (ARTEX platform control, non-target defence). Finding this marker in a
host's application or audit logs strongly supports that ARTEX ran on that host. This is a
host and forensic indicator, not a target-side signal.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-05
tags:
- attack.execution
- attack.t1059
logsource:
category: application
detection:
keywords:
- '【ARTEX 平台管控·非目标防御】'
condition: keywords
falsepositives:
- Logs that quote this defense guide or the ARTEX source code for documentation purposes.
level: high
@@ -0,0 +1,37 @@
title: ARTEX Recording-Proxy MITM CA Certificate Artifact
id: 3bac40a5-a780-4d1f-a7e8-5d0daa29ef47
status: experimental
description: |
Detects creation of the man-in-the-middle certificate-authority file the ARTEX recording proxy writes
when it starts. ARTEX embeds a go-mitmproxy traffic recorder that decrypts and logs every HTTP(S)
exchange its worker tools make; on first start the recorder generates a CA under its data directory
(traffic/traffic.go writes "<dir>/_ca/mitmproxy-ca-cert.pem") and injects it into spawned tools through
SSL_CERT_FILE / CURL_CA_BUNDLE / REQUESTS_CA_BUNDLE / NODE_EXTRA_CA_CERTS together with an
HTTP(S)_PROXY pointing at the loopback recorder (agent/worker.go). The file appearing on a host is a
forensic artifact of that recording proxy having run: an adversary-in-the-middle traffic recorder
(ATT&CK T1557) whose trust anchor is an installed root certificate. The "_ca/mitmproxy-ca-cert.pem"
layout narrows it to ARTEX's data directory; a bare mitmproxy-ca-cert.pem is shared with standalone
go-mitmproxy / mitmproxy, so treat a hit as a host-triage lead to correlate with the loopback proxy
endpoint and server port (see the indicators list), not a standalone alert.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-07
tags:
- attack.credential-access
- attack.collection
- attack.t1557
logsource:
category: file_event
detection:
selection:
TargetFilename|contains|all:
- '_ca'
- 'mitmproxy-ca-cert.pem'
condition: selection
falsepositives:
- Standalone go-mitmproxy or mitmproxy deployments that write the same CA filename.
- Developers intentionally running a recording or debugging proxy on the host.
level: medium
@@ -0,0 +1,27 @@
title: ARTEX Self-Update Egress User-Agent
id: e96380a3-2a34-4237-be2b-088ad9cc947d
status: experimental
description: |
Detects outbound (egress) HTTP requests whose User-Agent is "artex-selfupdate", used by the
ARTEX self-update routine when it queries code-repository hosts (for example GitHub releases)
for a newer binary. Seeing this User-Agent leave an internal host toward a code-hosting
service suggests an ARTEX binary is installed on that host. This is primarily an operator and
forensic indicator on a (possibly compromised relay) host, not a target-side signal.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-05
tags:
- attack.command-and-control
- attack.t1105
logsource:
category: proxy
detection:
selection:
c-useragent: 'artex-selfupdate'
condition: selection
falsepositives:
- Unlikely; this User-Agent string is specific to the ARTEX self-update client.
level: medium
@@ -0,0 +1,37 @@
# references base rule: ../artex_enrich_user_agent.yml (ARTEX Asset Enrichment Probe User-Agent)
title: ARTEX Enrichment Fan-Out (One Source, Many Distinct Hosts)
id: 6fba3b7c-1dd9-4e18-bf55-d93fc1d2e2e0
status: experimental
description: |
Correlates a single client carrying the ARTEX enrichment User-Agent to many DISTINCT
destination hosts within a short window (distinct count of cs-host). Autonomous enrichment
fans out across an asset list at machine speed, so breadth — the number of different hosts
touched, not just request volume — is what separates it from a person browsing a few pages.
Evaluate this where your telemetry spans multiple hosts (CDN, WAF, reverse proxy, or shared
hosting) or at an egress point that sees outbound enrichment. As with the base rule, the
User-Agent can be changed; the durable signal is the fan-out behaviour, so pair this with the
defense guide section 4 and tune the distinct-host threshold and window to your environment.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-05
tags:
- attack.reconnaissance
- attack.t1595
- attack.t1592
correlation:
type: value_count
rules:
- 34adfa15-1696-4322-afc0-f69988e9cc1e
group-by:
- c-ip
timespan: 10m
condition:
gte: 20
field: cs-host
falsepositives:
- Shared egress (NAT/proxy) where many users appear as one source; a legitimate scanner or
uptime monitor that fronts many hosts. Allow-list known sources and raise the threshold.
level: high
@@ -0,0 +1,35 @@
# references base rule: ../artex_enrich_user_agent.yml (ARTEX Asset Enrichment Probe User-Agent)
title: ARTEX Enrichment Scan Velocity (Burst From One Source)
id: 1d07c5f1-e0ff-4a6a-8017-6008fa790889
status: experimental
description: |
Correlates a burst of ARTEX asset-enrichment probes from a single client within a short
window. The base rule matches the "artex-enrich/1.0" User-Agent; this correlation adds the
behaviour the single-request rule misses — velocity. ARTEX enriches assets with a default
concurrency of 4 and ships no built-in rate limit (enrich/enrich.go), so an active run emits
many enrichment requests in quick succession rather than one. An operator can change the
User-Agent, so a quiet result is inconclusive, not proof of safety; see the behaviour-based
detection in the defense guide, section 4. Tune the count and window to your own baseline.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-05
tags:
- attack.reconnaissance
- attack.t1595
- attack.t1592
correlation:
type: event_count
rules:
- 34adfa15-1696-4322-afc0-f69988e9cc1e
group-by:
- c-ip
timespan: 5m
condition:
gte: 30
falsepositives:
- Legitimate asset-management or monitoring tools that set this User-Agent and poll many
assets; allow-list their source addresses.
level: high
@@ -0,0 +1,34 @@
# references base rule: ../artex_guard_audit_framing.yml (ARTEX Platform Guard Audit-Log Framing)
title: ARTEX Guard-Block Burst (Active Engaged Session)
id: 065c11b5-4dcf-48ae-84fe-e8301346d5b4
status: experimental
description: |
Correlates repeated ARTEX platform-guard control markers in one host's application or audit
log within a short window. The base rule matches a single marker, which can also appear in a
document or source file that merely quotes it. A burst of the same marker on one host instead
indicates an ARTEX run that is actively and repeatedly tripping its guard — which both
confirms execution on that host and removes the quote-a-marker false positive of the single
event. This remains a host and forensic indicator, not a target-side signal. Tune the count
and window to your environment.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-05
tags:
- attack.execution
- attack.t1059
correlation:
type: event_count
rules:
- 3add497e-36cb-47c4-8993-df8f98585ef7
group-by:
- host
timespan: 10m
condition:
gte: 5
falsepositives:
- A log pipeline that repeatedly ingests or re-processes a document quoting this marker;
scope the rule to runtime application/audit logs, not documentation stores.
level: high
@@ -0,0 +1,40 @@
# references base rules:
# ../artex_guard_audit_framing.yml (ARTEX Platform Guard Audit-Log Framing)
# ../destructive_command_hunting.yml (Destructive Command Execution — ARTEX Guard-List Hunting)
title: ARTEX Guard Marker With Destructive Command on One Host
id: 1a03bfb8-7893-4730-9422-dd50c2dd91e8
status: experimental
description: |
Temporal correlation for the multi-stage behaviour in the defense guide, section 4.2: on a
single host, the ARTEX platform-guard control marker (confirming ARTEX executed there) AND a
destructive command from the guard deny-list hunting rule occur within the same window.
Pairing an ARTEX-specific marker with the otherwise-generic destructive-command signal raises
specificity. A destructive command on its own is routine administration and a known source of
false positives; one that co-occurs with an active ARTEX run on the same host is worth
investigating. This assumes a normalized host field is present across both the application or
audit logs and the process-creation logs; map it in your pipeline. It does not by itself prove
ARTEX issued the command — the guard blocks these patterns, so a hit means the destructive
command ran outside or despite the guard near an ARTEX run. Treat it as a high-priority lead.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-05
tags:
- attack.execution
- attack.t1059
- attack.impact
- attack.t1485
correlation:
type: temporal
rules:
- 3add497e-36cb-47c4-8993-df8f98585ef7
- f510564f-2958-4dc8-a188-3300a2f6f5a7
group-by:
- host
timespan: 30m
falsepositives:
- Maintenance windows where an operator legitimately runs ARTEX and, separately, performs
destructive administration on the same host within the window. Confirm with change tickets.
level: high
@@ -0,0 +1,64 @@
title: Destructive Command Execution (ARTEX Guard-List Hunting)
id: f510564f-2958-4dc8-a188-3300a2f6f5a7
status: experimental
description: |
Hunts for destructive shell and database commands on a host. The pattern set mirrors the
built-in deny rules the ARTEX guard ships with (db/db.go seed): because the guard blocks
these, they are the inverse image of the destructive actions an autonomous agent could
attempt if the guard were disabled or bypassed. This is GENERIC destructive-command hunting
informed by that list, not an ARTEX-specific signature, and matches are expected from
legitimate administration. Tune and allow-list for your environment and treat a hit as a
hunting lead, not a standalone alert. High-noise availability commands the guard also blocks
(bare shutdown/reboot) are intentionally omitted here; hunt those separately. The database
patterns likewise track data-destroying objects (DROP DATABASE/TABLE/SCHEMA) rather than the
guard's wider DROP set (INDEX/VIEW/USER/ROLE/TABLESPACE), which alter structure or access
rather than destroy data and are noisy in routine migrations.
references:
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-ko.md
- https://github.com/jiwoochris/artex-ko/blob/main/docs/defense-en.md
- https://github.com/jiwoochris/artex-ko
author: artex-ko defense guide
date: 2026-10-05
tags:
- attack.impact
- attack.t1485
- attack.t1561.002
- attack.t1489
logsource:
category: process_creation
detection:
selection_filesystem:
CommandLine|contains:
- 'rm -rf'
- 'rm -fr'
- 'rm --recursive'
- '--no-preserve-root'
- 'mkfs'
- 'dd of=/dev/'
- 'shred '
- 'wipe /dev/'
selection_database:
CommandLine|contains:
- 'DROP DATABASE'
- 'DROP TABLE'
- 'DROP SCHEMA'
- 'TRUNCATE '
- '.dropDatabase('
- '.dropCollection('
- 'FLUSHALL'
- 'FLUSHDB'
selection_availability:
CommandLine|contains:
- 'curl -X DELETE'
- 'curl --request DELETE'
- 'wget --method=DELETE'
- 'iptables -F'
- 'nft flush ruleset'
- 'kill -9 -1'
- 'killall -9'
condition: 1 of selection_*
falsepositives:
- Routine system administration, maintenance scripts, and container teardown.
- CI/CD pipelines that drop and recreate test databases or caches.
- The GNU coreutils `truncate` command (e.g. log rotation `truncate -s 0 file`) shares the TRUNCATE token; allow-list it, since it is followed by a flag rather than a table name.
level: medium