ขอบคุณที่สนใจช่วยกันทำ detection content ให้ SOC ในภูมิภาคนี้แข็งแรงขึ้นครับ 🙏 เอกสารนี้อธิบายวิธีเขียน rule ที่ผ่านมาตรฐานของเรา และวิธีส่ง Pull Request
คุณภาพ > ปริมาณ. rule เดียวที่ทำให้ SOC ของคนอื่น alert ท่วมเพราะ false positive ทำลายความน่าเชื่อถือมากกว่าการไม่มี rule นั้นเลย
ทุก rule ที่ merge เข้า main ต้อง:
- ✅ ผ่าน
sigma-cli check(syntax + schema) — CI จะ block ถ้าไม่ผ่าน - 🎯 map กับ MITRE ATT&CK อย่างน้อย 1 technique (
tags) ⚠️ มีfalsepositivesที่เขียนจากประสบการณ์จริง ไม่ใช่ "Unknown"- 🧪 มี sample log ใน
tests/ที่ rule นี้ควรตรวจจับได้ - 📖 ถ้าเป็น
level: highหรือcriticalต้องมี playbook คู่กันในplaybooks/
ดูตัวอย่างจริงที่ผ่านมาตรฐานได้ที่ sigma/web/web_webshell_creation_in_webroot.yml
field ที่ บังคับ:
| field | หมายเหตุ |
|---|---|
title |
สั้น ชัด < 80 ตัวอักษร |
id |
UUID v4 (รัน python -c "import uuid; print(uuid.uuid4())") |
status |
experimental สำหรับ rule ใหม่ → stable หลังผ่านสนามจริง |
description |
อธิบายว่าจับอะไร และทำไมถึงน่าสงสัย |
references |
ลิงก์ advisory / report / blog ที่อ้างอิง |
author |
ใส่ชื่อจริงหรือ handle ของคุณ — นี่คือ portfolio ของคุณ |
date |
YYYY-MM-DD |
tags |
ต้องมี attack.<tactic> และ attack.tNNNN |
logsource |
ระบุ category/product/service ให้ถูก |
detection |
selection + condition |
falsepositives |
list ของจริง |
level |
informational / low / medium / high / critical |
field เสริมเฉพาะ repo นี้ (ใส่ใน tags แบบ custom prefix):
ecop.sector.finance/ecop.sector.healthcare/ecop.sector.govecop.region.th/ecop.region.asean
ความเสี่ยงอันดับ 1 ของ public detection repo ไม่ใช่ การโดน hack — แต่คือ ข้อมูลลูกค้า/internal หลุดติดไปกับ rule หรือ sample log แล้วลบไม่ออกเพราะมันอยู่ใน git history ถาวร
- Raw log ของลูกค้า — แม้แต่ชิ้นเดียว ต้อง sanitize ก่อนเสมอ
- Hostname / internal IP จริง (
10.x,172.16–31.x,192.168.x), internal domain (*.corp,*.local,*.ad) - ชื่อจริง / อีเมล / เลขบัตรประชาชน / เบอร์โทร ของบุคคล (PII ตาม PDPA)
- ชื่อลูกค้า ชื่อระบบภายใน path จริง credential ทุกชนิด (แม้หมดอายุแล้ว)
- 🚫 ชื่อแบรนด์/บริษัท/keyword ที่ลูกค้าจ้างเฝ้าระวัง (DRP/brand-monitoring) — ห้ามใส่ใน public rule เด็ดขาด
- เหตุผล: brand-monitoring/DRP ของเจ้าของแบรนด์อาจเจอชื่อตัวเองใน repo เรา → ดูเป็นภาพลบ + เปิดเผยความสัมพันธ์ลูกค้า
- public rule ใช้ได้แค่ placeholder / โทเคนทั่วไป (เช่น
examplebank,promptpay) — ของจริงเก็บใน private fork / XIPHER DRP
- detection ที่ผูกกับ active IR ที่ยังไม่ปิดเคส — รอปิดเคสก่อน
| ของจริง | ใช้แทนด้วย |
|---|---|
| hostname/domain | FIN-DC01.corp.example.co.th |
| IP (documentation) | 192.0.2.x, 198.51.100.x, 203.0.113.x (RFC 5737) |
| ชื่อบุคคล / user | CORP\nattapong, ชื่อสมมติ |
| อีเมล | someone@example.co.th |
- ติดตั้ง pre-commit hook ก่อนเริ่มเขียน:
pip install pre-commit && pre-commit install - ทุก commit จะถูกสแกนด้วย gitleaks (secret + PII + internal IP/domain) — ถ้าเจอ จะ block ไม่ให้ commit
- CI สแกนซ้ำทั้ง history อีกชั้น
⚠️ ถ้าเผลอ commit ข้อมูล sensitive ไปแล้ว การลบไฟล์เฉย ๆ ไม่พอ — มันยังอยู่ใน history ให้แจ้ง maintainer ทันที เราจะgit filter-repoล้างประวัติ (และถือว่าข้อมูลนั้น compromised แล้ว)
# 1. fork + clone
git clone https://github.com/<you>/detection-rules.git
cd detection-rules
# 2. ตั้ง dev env
pip install -r requirements-dev.txt # sigma-cli, pyyaml, pytest
# 3. สร้าง branch
git checkout -b rule/webshell-aspx-china-chopper
# 4. เขียน rule + sample log ใน tests/
# 5. validate ในเครื่องก่อน push
make check # = sigma-cli check + yaml lint + ทดสอบ sample log
# หรือรันตรง ๆ:
sigma check sigma/
# 6. commit ด้วย convention
git commit -m "add: detect China Chopper webshell in IIS webroot"
# 7. เปิด PR — template จะ checklist ให้เอง| prefix | ใช้เมื่อ |
|---|---|
add: |
rule ใหม่ |
fix: |
แก้ false positive / logic |
tune: |
ปรับ threshold / filter |
docs: |
แก้ playbook / README |
- maintainer ของ ECOP จะ review ภายใน ~3 วันทำการ
- เราอาจขอ sample log เพิ่มเพื่อยืนยันว่า rule ยิงโดนจริงและไม่ over-match
- rule ที่ดีแต่ยัง
experimentalก็ merge ได้ — เราจะเลื่อนเป็นstableเมื่อมีหลักฐานจากสนาม
มองหา issue ป้าย good first rule — เป็นโจทย์ที่ scope ชัด เหมาะกับการลองทำชิ้นแรก
ถ้า contribution ของคุณเข้าตา เราอยากชวนคุยเรื่องร่วมงานกับ ECOP ด้วยนะครับ 😉
มีคำถาม? เปิด Discussion ได้เลย