├── LICENSE
├── images
├── roota_logo.png
├── roota_logo_double.png
└── roota_logo_horizontal.png
├── README.md
├── README_Spanish.md
├── README_Ukrainian.md
├── Roota_Specification.md
└── Roota_Specification_Ukrainian.md
/LICENSE:
--------------------------------------------------------------------------------
1 | RootA is a public-domain language
2 |
--------------------------------------------------------------------------------
/images/roota_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UncoderIO/Roota/HEAD/images/roota_logo.png
--------------------------------------------------------------------------------
/images/roota_logo_double.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UncoderIO/Roota/HEAD/images/roota_logo_double.png
--------------------------------------------------------------------------------
/images/roota_logo_horizontal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/UncoderIO/Roota/HEAD/images/roota_logo_horizontal.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | # An Open-Source Language for Collective Cyber Defense
6 | :earth_americas: [English](README.md) | [Українська](README_Ukrainian.md) | [Español](README_Spanish.md)
7 |
8 | Roota is a public-domain language for collective cyber defense, created to make threat detection, incident response, and actor attribution simple. It acts as an open-source wrapper on top of most of the existing SIEM, EDR, XDR, and Data Lake query languages. If you learn the basics of Roota, you will be able to contribute to collective defense. And if you have mastered a specific SIEM language, with Roota and Uncoder IO you can speak them all.
9 |
10 | **Table Of Contents:**
11 |
12 | - [Why Roota](#smiling_face_with_three_hearts-why-roota)
13 | - [Writing Roota Rules](#mage-writing-roota-rules)
14 | - [How to Contribute](#cookie-how-to-contribute)
15 | - [Maintainers](#smile_cat-maintainers)
16 | - [Credits](#clap-credits)
17 | - [Licenses](#globe_with_meridians-licenses)
18 | - [Resources & Useful Links](#book-resources--useful-links)
19 |
20 | ## :smiling_face_with_three_hearts: Why Roota
21 | The objective of Roota is to accelerate the global cybersecurity industry collaboration. With Roota acting as a wrapper, cyber defenders can take a native rule or query and augment it with metadata to automatically translate the code into other SIEM, EDR, XDR, and Data Lake languages. Inspired by the success of Yara and Sigma rules, Roota is focused on a broader applicability by a larger community of defenders.
22 |
23 | - Roota is expressed using **YAML**, a widely spread, easy-to-write, human-readable format.
24 | - **Use any query language** for detection, Uncoder IO will take care of the translation.
25 | - **Correlation support.** Common correlations are supported by Roota in order to make detection logic harder to bypass by the attackers, more compute efficient, and future-proof.
26 | - **Log sources** can be explicitly or implicitly defined in the native query itself or in the customizable `logsource` field.
27 | - Roota syntax fully accommodates **OCSF** and **Sigma** as taxonomy, making it fast to learn, easy to read and share, and providing maximum compatibility for Detection Engineers.
28 | - **Threat Actor Timeline.** While Actors change, behaviors often stay the same. Roota supports an additional threat intelligence layer for CERTs, NCSCs, ISACs, MDRs, and Defence Agencies, to coordinate defense faster and with greater precision.
29 | - **Mapping to TTPs.** Link detection logic to related tactics, techniques, and procedures in terms of MITRE ATT&CK®. Use custom tags to make the mapping even more tailored and detailed.
30 | - **Response as Code.** With enough community members and industry adoption, the next step after detection is sharing the code to automate response.
31 |
32 | ## :mage: Writing Roota Rules
33 | You can start writing Roota rules in any code editor that supports YAML.
34 | To translate Roota rules to other languages use Uncoder IO by building it from the source https://github.com/UncoderIO/UncoderIO or hosted online privately by SOC Prime since 2018 at https://uncoder.io
35 |
36 | ### Roota Rule Templates
37 | Roota Rule format has minimal, full, and extended templates.
38 |
39 | **Minimal** template is for keeping rules simple, requiring only a name, description, author, severity, date, MITRE ATT&CK tags, detection query in any specific language, reference, and license.
40 |
41 | **Full** template is for adding alerting context, threat actor campaign timeline, specific log source attributes defined based on Sigma Rules or OCSF taxonomy, and cross-platform correlation section.
42 |
43 | **Extended** template is currently reserved for adding response as code and experimental features.
44 |
45 | #### Minimal Roota rule example:
46 | ```
47 | name: Possible Credential Dumping Using Comsvcs.dll (via cmdline)
48 | details: Adversaries can use built-in library comsvcs.dll to dump credentials on a compromised host.
49 | author: SOC Prime Team
50 | severity: high
51 | date: 2020-05-24
52 | mitre-attack:
53 | - t1003.001
54 | - t1136.003
55 | detection:
56 | language: splunk-spl-query # elastic-lucene-query, logscale-lql-query, mde-kql-query
57 | body: index=* ((((process="*comsvcs*") AND (process="*MiniDump*")) OR ((process="*comsvcs*") AND (process="*#24*"))) OR ((process="*comsvcs*") AND (process="*full*")))
58 | references:
59 | - https://badoption.eu/blog/2023/06/21/dumpit.html
60 | license: DRL 1.1
61 | ```
62 |
63 | #### Full Roota rule example:
64 | ```
65 | name: Possible Credential Dumping Using Comsvcs.dll (via cmdline)
66 | details: Adversaries can use built-in library comsvcs.dll to dump credentials on a compromised host.
67 | author: SOC Prime Team
68 | severity: high
69 | type: query
70 | class: behaviour
71 | date: 2020-05-24
72 | mitre-attack:
73 | - t1003.001
74 | - t1136.003
75 | tram-tags:
76 | NaiveBayes:
77 | - t1136.003
78 | MLPClassifier:
79 | - t1003.001
80 | LogisticRegression:
81 | - t1003
82 | - t1003.005
83 | detection:
84 | language: splunk-spl-query # elastic-lucene-query, logscale-lql-query, mde-kql-query
85 | body: index=* ((((process="*comsvcs*") AND (process="*MiniDump*")) OR ((process="*comsvcs*") AND (process="*#24*"))) OR ((process="*comsvcs*") AND (process="*full*")))
86 | logsource:
87 | product: Windows # Sigma or OCSF products
88 | log_name: Security # OCSF log names
89 | class_name: Process Activity # OCSF classes
90 | #category: # Sigma categories
91 | #service: # Sigma services
92 | audit:
93 | source: Windows Security Event Log
94 | enable: Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Detailed Tracking -> Audit Process
95 | timeline:
96 | 2022-04-01 - 2022-08-08: Bumblebee
97 | 2022-07-27: KNOTWEED
98 | 2022-12-04: UAC-0082, CERT-UA#4435
99 | references:
100 | - https://badoption.eu/blog/2023/06/21/dumpit.html
101 | tags: Bumblebee, UAC-0082, CERT-UA#4435, KNOTWEED, Comsvcs, cir_ttps, ContentlistEndpoint
102 | license: DRL 1.1
103 | version: 1
104 | uuid: 151fbb45-0048-497a-95ec-2fa733bb15dc
105 | correlation:
106 | timeframe: 1m
107 | functions: count() > 3
108 | #response: [] # extended format
109 | ```
110 |
111 | ### Fields
112 | [Roota specification](https://github.com/UncoderIO/Roota/blob/main/Roota_Specification.md) includes the list of all fields that can be used to write a Roota rule.
113 |
114 | ## :cookie: How to Contribute
115 | Your contribution really matters in evolving the project and helping us make the Roota language even more useful for the global cyber defender community.
116 |
117 | To submit your pull request with your ideas or suggestions for changes, take the following steps:
118 |
119 | 1. Fork the [Roota repository](https://github.com/UncoderIO/Roota/tree/main) and clone your fork to your local environment.
120 | 2. Create a new feature branch in which you’re going to make your changes.
121 | 3. Then commit your changes to your newly created feature branch.
122 | 4. Push the changes to your fork.
123 | 5. Create a new Pull Request
124 | a. Clicking the New Pull Request button.
125 | b. Select your fork along with a feature branch.
126 | c. Provide a title and a description of your changes. Make sure they are both clear and informative.
127 | d. Finally, submit your Pull Request and wait for its approval.
128 |
129 | Thank you for your contribution to the Roota project!
130 |
131 | ## :smile_cat: Maintainers
132 | - [Roman Ranskyi](https://www.linkedin.com/in/roman-966b91b5/)
133 | - [Alex Bredikhin](https://www.linkedin.com/in/bredikhin/)
134 | - [Adam Swan](https://github.com/acalarch/)
135 | - [Ruslan Mikhalov](https://www.linkedin.com/in/rmikhalov/)
136 | - [Andrii Bezverkhyi](https://www.linkedin.com/in/andriimb/)
137 |
138 | ## :clap: Credits
139 | We are genuinely grateful to security professionals who contribute their time, expertise, and creativity to evolve the Roota open-source project.
140 |
141 | ## :globe_with_meridians: Licenses
142 | The contents of this repo, along with Roota specifications, are in the public domain.
143 |
144 | ## :book: Resources & Useful Links
145 | - [Roota.IO](https://roota.io/) the main website page of the Roota project
146 | - [Uncoder.IO](https://github.com/UncoderIO/UncoderIO/) source code for translation engine Uncoder IO which supports Roota, Sigma, and IOC packaging into specific SIEM, EDR, and Data Lake query formats
147 | - [Uncoder.IO](https://uncoder.io/) private hosted version of Uncoder IO since 2018, operated by SOC Prime, does not track you, does not see your code
148 | - [Roota Discord Channel](https://tdm.socprime.com/zeptolink/5IAokHui2iWUHaB8/) Discord channel to network with Roota enthusiasts
149 |
--------------------------------------------------------------------------------
/README_Spanish.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | # Un lenguaje de código abierto para la ciberdefensa colectiva
6 | :earth_americas: [English](README.md) | [Українська](README_Ukrainian.md) | [Español](README_Spanish.md)
7 |
8 | Roota es un lenguaje de dominio público que contribuye a la ciberdefensa colectiva, creado para simplificar la detección de amenazas, la respuesta a incidentes y la atribución de adversarios. Actúa como un contenedor de código abierto sobre la mayoría de los lenguajes de consulta SIEM, EDR, XDR y Data Lake existentes. Si aprendes los conceptos básicos de Roota, podrás contribuir a la defensa colectiva. Y si dominas un idioma SIEM específico, con Roota y Uncoder IO, podrás manejarlos todos.
9 |
10 | **Tabla de Contenidos:**
11 |
12 | - [Porqué Roota](#smiling_face_with_three_hearts-porqué-roota)
13 | - [Escribir reglas Roota](#mage-escribir-reglas-roota)
14 | - [Cómo contribuir](#cookie-cómo-contribuir)
15 | - [Mantenedores](#smile_cat-mantenedores)
16 | - [Créditos](#clap-créditos)
17 | - [Licencias](#globe_with_meridians-licencias)
18 | - [Recursos y link útiles](#book-recursos-y-link-útiles)
19 |
20 | ## :smiling_face_with_three_hearts: Por qué Roota?
21 | El objetivo de Roota es acelerar la colaboración global en la industria de la ciberseguridad. Con Roota actuando como contenedor, los ciber defensores pueden tomar una regla o consulta nativa y potenciarla con metadatos para traducir automáticamente el código a otros lenguajes SIEM, EDR, XDR y Data Lake. Inspirado por el éxito de las reglas de Yara y Sigma, Roota se centra en una aplicabilidad más amplia por parte de una gran comunidad de defensores.
22 |
23 | - Roota se expresa mediante **YAML**, un formato ampliamente difundido, fácil de escribir y legible por humanos.
24 | - **Utilice cualquier lenguaje** de consulta de detección, Uncoder IO se encargará de la traducción.
25 | - **Soporte de correlación.** Roota admite correlaciones comunes para hacer que la lógica de detección sea más difícil de eludir por parte de los atacantes, una alta eficiencia de procesamiento y con durabilidad a largo plazo.
26 | - Las **fuentes de registro** se pueden definir explícita o implícitamente en la propia consulta nativa o en el campo de fuente de registro personalizable.
27 | - La sintaxis de Roota se adapta completamente a **OCSF** y **Sigma** como taxonomía, lo que la hace rápida de aprender, fácil de leer y compartir, y brinda máxima compatibilidad para los ingenieros de detección.
28 | - **Cronología del actor de amenazas.** Si bien los actores cambian, los comportamientos suelen permanecer iguales. Roota admite una capa adicional de inteligencia sobre amenazas para CERT, NCSC, ISAC, MDR y agencias de defensa, para coordinar la defensa más rápido y con mayor precisión.
29 | - **Mapeo a TTP.** Vincular la lógica de detección con tácticas, técnicas y procedimientos relacionados en términos de MITRE ATT&CK®. Utilice etiquetas personalizadas para que el mapeo sea aún más personalizado y detallado.
30 | - **Respuesta como código.** Con una participación suficiente de la comunidad y una aceptación generalizada en la industria, el siguiente paso después de la detección es compartir el código para automatizar la respuesta.
31 |
32 | ## :mage: Escribir reglas Roota
33 | Puedes comenzar a escribir reglas Roota en cualquier editor de código que admita YAML. Para traducir las reglas de Roota a otros lenguajes, utiliza Uncoder IO compilándolo desde la fuente https://github.com/UncoderIO/UncoderIO o alojado en línea de forma privada por SOC Prime desde 2018 en https://uncoder.io
34 |
35 | ### Plantillas de reglas Roota
36 | El formato de regla Roota tiene plantillas mínimas, completas y extendidas.
37 |
38 | La plantilla **mínima** sirve para mantener las reglas simples y solo requiere un nombre, descripción, autor, gravedad, fecha, etiquetas MITRE ATT&CK, consulta de detección en cualquier idioma específico, referencia y licencia.
39 |
40 | La plantilla **completa** sirve para agregar contexto de alerta, cronograma de campaña de actores de amenazas, atributos de origen de registro específicos definidos en función de las reglas Sigma o la taxonomía de OCSF y una sección de correlación multiplataforma.
41 |
42 | Actualmente, la plantilla **extendida** está reservada para agregar respuestas como código y funciones experimentales.
43 |
44 | #### Ejemplo de regla mínima Roota:
45 | ```
46 | name: Possible Credential Dumping Using Comsvcs.dll (via cmdline)
47 | details: Adversaries can use built-in library comsvcs.dll to dump credentials on a compromised host.
48 | author: SOC Prime Team
49 | severity: high
50 | date: 2020-05-24
51 | mitre-attack:
52 | - t1003.001
53 | - t1136.003
54 | detection:
55 | language: splunk-spl-query # elastic-lucene-query, logscale-lql-query, mde-kql-query
56 | body: index=* ((((process="*comsvcs*") AND (process="*MiniDump*")) OR ((process="*comsvcs*") AND (process="*#24*"))) OR ((process="*comsvcs*") AND (process="*full*")))
57 | references:
58 | - https://badoption.eu/blog/2023/06/21/dumpit.html
59 | license: DRL 1.1
60 | ```
61 |
62 | #### Ejemplo de regla completa Roota:
63 | ```
64 | name: Possible Credential Dumping Using Comsvcs.dll (via cmdline)
65 | details: Adversaries can use built-in library comsvcs.dll to dump credentials on a compromised host.
66 | author: SOC Prime Team
67 | severity: high
68 | type: query
69 | class: behaviour
70 | date: 2020-05-24
71 | mitre-attack:
72 | - t1003.001
73 | - t1136.003
74 | detection:
75 | language: splunk-spl-query # elastic-lucene-query, logscale-lql-query, mde-kql-query
76 | body: index=* ((((process="*comsvcs*") AND (process="*MiniDump*")) OR ((process="*comsvcs*") AND (process="*#24*"))) OR ((process="*comsvcs*") AND (process="*full*")))
77 | logsource:
78 | product: Windows # Sigma or OCSF products
79 | log_name: Security # OCSF log names
80 | class_name: Process Activity # OCSF classes
81 | #category: # Sigma categories
82 | #service: # Sigma services
83 | audit:
84 | source: Windows Security Event Log
85 | enable: Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Detailed Tracking -> Audit Process
86 | timeline:
87 | 2022-04-01 - 2022-08-08: Bumblebee
88 | 2022-07-27: KNOTWEED
89 | 2022-12-04: UAC-0082, CERT-UA#4435
90 | references:
91 | - https://badoption.eu/blog/2023/06/21/dumpit.html
92 | tags: Bumblebee, UAC-0082, CERT-UA#4435, KNOTWEED, Comsvcs, cir_ttps, ContentlistEndpoint
93 | license: DRL 1.1
94 | version: 1
95 | uuid: 151fbb45-0048-497a-95ec-2fa733bb15dc
96 | correlation:
97 | timeframe: 1m
98 | functions: count() > 3
99 | #response: [] # extended format
100 | ```
101 |
102 | ### Campos
103 | La [especificación Roota](https://github.com/UncoderIO/Roota/blob/main/Roota_Specification.md) incluye la lista de todos los campos que se pueden utilizar para escribir una regla Roota.
104 |
105 | ## :cookie: Cómo contribuir
106 | Tu contribución es realmente importante para hacer evolucionar el proyecto y ayudarnos a hacer que el lenguaje Roota sea aún más útil para la comunidad global de ciber defensores.
107 |
108 | Para enviar tu pull request con tus ideas o sugerencias de cambios, sigue los siguientes pasos:
109 |
110 | 1. Realiza un Fork del repositorio [repositorio Roota](https://github.com/UncoderIO/Roota/tree/main) y clona la misma en tu entorno local.
111 | 2. Crea un nuevo Feature Branch en el que realizarán los cambios.
112 | 3. Luego, confirma tus cambios en el recién creado Feature Branch.
113 | 4. Haz un push de los cambios a tu Fork.
114 | 5. Crea un nuevo Pull Request
115 | a. Al hacer clic en el botón New Pull Request.
116 | b. Selecciona tu Fork junto con tu Feature Branch.
117 | c. Proporciona un título y una descripción de tus cambios. Asegúrate de que sean claros e informativos.
118 | d. Finalmente, envía tu Pull Request y espera su aprobación.
119 |
120 | Gracias por tu contribución al proyecto Roota!
121 |
122 | ## :smile_cat: Mantenedores
123 | - [Roman Ranskyi](https://www.linkedin.com/in/roman-966b91b5/)
124 | - [Alex Bredikhin](https://www.linkedin.com/in/bredikhin/)
125 | - [Adam Swan](https://github.com/acalarch/)
126 | - [Ruslan Mikhalov](https://www.linkedin.com/in/rmikhalov/)
127 | - [Andrii Bezverkhyi](https://www.linkedin.com/in/andriimb/)
128 |
129 | ## :clap: Créditos
130 | Estamos sinceramente agradecidos con los profesionales de la seguridad que aportan su tiempo, experiencia y creatividad para hacer evolucionar el proyecto de código abierto Roota.
131 |
132 | ## :globe_with_meridians: Licencias
133 | El contenido de este repositorio, junto con las especificaciones de Roota, son de dominio público.
134 |
135 | ## :book: Recursos y link útiles
136 | - [Roota.IO](https://roota.io/) la página web principal del proyecto Roota
137 | - [Uncoder.IO](https://github.com/UncoderIO/UncoderIO/) Código fuente para el motor de traducción Uncoder IO que admite el empaquetado Roota, Sigma e IOC en formatos de consulta específicos SIEM, EDR y Data Lake
138 | - [Uncoder.IO](https://uncoder.io/) versión alojada privada de Uncoder.IO desde 2018, operada por SOC Prime, no te rastrea, no ve tu código
139 | - [Canal de Discord Roota](https://tdm.socprime.com/zeptolink/5IAokHui2iWUHaB8/) Canal de Discord para establecer contactos con entusiastas de Roota
140 |
--------------------------------------------------------------------------------
/README_Ukrainian.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | # Мова з відкритим кодом для колективного кіберзахисту
6 |
7 | :earth_americas: [English](README.md) | [Українська](README_Ukrainian.md) | [Español](README_Spanish.md)
8 |
9 | Roota – це вільно розповсюджувана мова для колективного кіберзахисту, створена, щоб спростити виявлення загроз, реагування на інциденти та атрибуцію кібератак. Вона виступає обгорткою для мов запитів, що використовуються в різноманітних системах SIEM, EDR, XDR та Data Lake. Вивчивши основи Roota, ви зможете вносити свій вклад у колективний кіберзахист. Володіючи мовою одного SIEM, за допомогою Roota й Uncoder IO ви зможете говорити мовами всіх інших.
10 |
11 | **Зміст:**
12 |
13 | - [Ключові переваги Roota](#smiling_face_with_three_hearts-ключові-переваги-roota)
14 | - [Як писати правила на Roota](#mage-як-писати-правила-на-roota)
15 | - [Як долучитися до проєкту](#cookie-як-долучитися-до-проєкту)
16 | - [Хто веде проєкт](#smile_cat-хто-веде-проєкт)
17 | - [Учасники](#clap-учасники)
18 | - [Ліцензії](#globe_with_meridians-ліцензії)
19 | - [Ресурси та корисні посилання](#book-ресурси-та-корисні-посилання)
20 |
21 | ## :smiling_face_with_three_hearts: Ключові переваги Roota
22 | Мова Roota створена з метою пришвидшити глобальну співпрацю в галузі кібербезпеки. Використовуючи Roota як обгортку, спеціалісти з кібербезпеки можуть взяти нативне правило або запит і доповнити його метаданими, щоб потім автоматично перекласти код на мови інших систем SIEM, EDR, XDR та Data Lake. На створення мови Roota надихнув успіх правил на Yara та Sigma, але ця мова має ширшу сферу застосування й більшу потенційну аудиторію, для якої вона може бути корисною.
23 |
24 | - Для запису Roota використовується **YAML**, поширений формат, який легко читається людиною та зручний у використанні.
25 | - Код для детектування загроз **можна писати будь-якою мовою** – Uncoder IO згенерує автоматичний переклад.
26 | - **Підтримка кореляції.** Roota підтримує поширені функції кореляції, завдяки яким логіку детектування стає важче обійти, вона потребує менше обчислювальних ресурсів, а також не втрачає актуальності з часом.
27 | - **Джерела логів** можуть визначатися самим запитом нативною мовою або зазначатися окремо в полі `logsource`.
28 | - Синтаксис Roota повністю підтримує **OCSF** та **Sigma** як таксономію, завдяки чому цю мову швидко вчити, легко читати і просто використовувати для обміну знаннями, в якому б форматі інженер не писав алгоритми детектування.
29 | - **Хронологія дій зловмисників.** Зловмисники змінюються, але їхні методи часто залишаються такими, як і раніше. Roota підтримує додатковий рівень інформації про загрозу, що допомагає командам реагування на комп'ютерні надзвичайні події (CERT), національним центрам з кібербезпеки (NCSC), центрам обміну й аналізу інформації (ISAC), постачальникам послуг з виявлення та реагування на загрози (MDR) та різноманітним агенціям із кіберзахисту швидше й точніше координувати захисні заходи.
30 | - **Співставлення з тактиками, техніками та процедурами (TTP).** Прив'язуйте алгоритми детектування до відповідних тактик, технік та процедур по системі MITRE ATT&CK®. Використовуйте кастомні теги, щоб робити унікальні прив'язки.
31 | - **Реагування як код.** Коли спільнота виросте й з'явиться галузеве визнання, наступним кроком після алгоритмів детектування буде обмін кодом для автоматизації реагування на кіберзагрози.
32 |
33 | ## :mage: Як писати правила на Roota
34 | Писати правила на мові Roota можна в будь-якому редакторі коду, який підтримує YAML.
35 | Для перекладу правил Roota на інші мови, використовуйте Uncoder IO. Ви можете встановити його локально звідси: https://github.com/UncoderIO/UncoderIO або скористатися онлайн-версією, яку компанія SOC Prime пропонує з 2018 року, за адресою https://uncoder.io
36 |
37 | ### Шаблони правил Roota
38 | Для написання правила на Roota можна взяти мінімальний, повний або розширений шаблон.
39 |
40 | **Мінімальний** шаблон призначений для написання простих правил, де вказуються лише назва, опис, автор, рівень критичності, дата, теги MITRE ATT&CK, запит для детектування нативною мовою, посилання та ліцензія.
41 |
42 | **Повний** шаблон додатково містить поля для того, щоб вказати контекст, необхідний для аналізу сповіщення про загрозу, та хронологію кампанії кіберзловмисників, описати джерела логів за допомогою такономії Sigma або OCSF, а також додати кросплатформенні кореліції.
43 |
44 | **Розширений** шаблон наразі зарезервовано для додавання "реагування як коду" та експериментальних можливостей.
45 |
46 | #### Мінімальний шаблон правила Roota:
47 | ```
48 | name: Possible Credential Dumping Using Comsvcs.dll (via cmdline)
49 | details: Adversaries can use built-in library comsvcs.dll to dump credentials on a compromised host.
50 | author: SOC Prime Team
51 | severity: high
52 | date: 2020-05-24
53 | mitre-attack:
54 | - t1003.001
55 | - t1136.003
56 | detection:
57 | language: splunk-spl-query # elastic-lucene-query, logscale-lql-query, mde-kql-query
58 | body: index=* ((((process="*comsvcs*") AND (process="*MiniDump*")) OR ((process="*comsvcs*") AND (process="*#24*"))) OR ((process="*comsvcs*") AND (process="*full*")))
59 | references:
60 | - https://badoption.eu/blog/2023/06/21/dumpit.html
61 | license: DRL 1.1
62 | ```
63 |
64 | #### Повний шаблон правила Roota:
65 | ```
66 | name: Possible Credential Dumping Using Comsvcs.dll (via cmdline)
67 | details: Adversaries can use built-in library comsvcs.dll to dump credentials on a compromised host.
68 | author: SOC Prime Team
69 | severity: high
70 | type: query
71 | class: behaviour
72 | date: 2020-05-24
73 | mitre-attack:
74 | - t1003.001
75 | - t1136.003
76 | detection:
77 | language: splunk-spl-query # elastic-lucene-query, logscale-lql-query, mde-kql-query
78 | body: index=* ((((process="*comsvcs*") AND (process="*MiniDump*")) OR ((process="*comsvcs*") AND (process="*#24*"))) OR ((process="*comsvcs*") AND (process="*full*")))
79 | logsource:
80 | product: Windows # Sigma or OCSF products
81 | log_name: Security # OCSF log names
82 | class_name: Process Activity # OCSF classes
83 | #category: # Sigma categories
84 | #service: # Sigma services
85 | audit:
86 | source: Windows Security Event Log
87 | enable: Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Detailed Tracking -> Audit Process
88 | timeline:
89 | 2022-04-01 - 2022-08-08: Bumblebee
90 | 2022-07-27: KNOTWEED
91 | 2022-12-04: UAC-0082, CERT-UA#4435
92 | references:
93 | - https://badoption.eu/blog/2023/06/21/dumpit.html
94 | tags: Bumblebee, UAC-0082, CERT-UA#4435, KNOTWEED, Comsvcs, cir_ttps, ContentlistEndpoint
95 | license: DRL 1.1
96 | version: 1
97 | uuid: 151fbb45-0048-497a-95ec-2fa733bb15dc
98 | correlation:
99 | timeframe: 1m
100 | functions: count() > 3
101 | #response: [] # extended format
102 | ```
103 |
104 | ### Поля
105 | [Специфікація мови Roota](https://github.com/UncoderIO/Roota/blob/main/Roota_Specification_Ukrainian.md) описує всі поля, які можна використовувати в цій мові.
106 |
107 | ## :cookie: Як долучитися до проєкту
108 | Ми вдячні кожному, хто допомагає розвивати цей проєкт і робити мову Roota більш корисною для глобальної спільноти спеціалістів з кіберзахисту.
109 |
110 | Щоб зробити пул-реквест з ідеями або пропозиціями, виконайте такі дії:
111 |
112 | 1. Зробіть форк [репозиторія Roota](https://github.com/UncoderIO/Roota/tree/main) і створіть його локальну копію.
113 | 2. Створіть гілку, в якій ви вноситимете зміни.
114 | 3. Зробіть коміт зі внесеними змінами в створену вами гілку.
115 | 4. Відправте зміни у свій форк.
116 | 5. Створіть пул-реквест.
117 | a. Натисніть кнопку New Pull Request (Новий пул-реквест).
118 | b. Виберіть свій форк з гілкою, яка містить зміни.
119 | c. Зазначте назву та опис змін. Вони мать бути чіткими й інформативними.
120 | d. Відправте пул-реквест і очікуйте на його схвалення.
121 |
122 | Дякуємо за ваш внесок в проєкт Roota!
123 |
124 | ## :smile_cat: Хто веде проєкт
125 | - [Roman Ranskyi](https://www.linkedin.com/in/roman-966b91b5/)
126 | - [Alex Bredikhin](https://www.linkedin.com/in/bredikhin/)
127 | - [Adam Swan](https://github.com/acalarch/)
128 | - [Ruslan Mikhalov](https://www.linkedin.com/in/rmikhalov/)
129 | - [Andrii Bezverkhyi](https://www.linkedin.com/in/andriimb/)
130 |
131 | ## :clap: Учасники
132 | Ми щиро вдячні всім спеціалістам з кіберзахисту, які застосовують свої знання, проявляють кмітливість і докладають час для розвитку відкритого проєкту Roota.
133 |
134 | ## :globe_with_meridians: Ліцензії
135 | Вміст цього репозиторія, зокрема специфікація мови Roota, є суспільним надбанням (public domain).
136 |
137 | ## :book: Ресурси та корисні посилання
138 | - [Roota.IO](https://roota.io/) основна вебсторінка проєкту Roota
139 | - [Uncoder.IO](https://github.com/UncoderIO/UncoderIO/) вихідний код рушія перекладів Uncoder IO, який підтримує автоматичний переклад Roota й Sigma, а також генерацію запитів з індикаторами компрометації (IOC) на мовах різних SIEM, EDR та Data Lake
140 | - [Uncoder.IO](https://uncoder.io/) онлайн-версія Uncoder IO, яка з 2018 року підтримується компанією SOC Prime і надає повну приватність: ніхто не відстежує ні ваші дії, ні ваш код
141 | - [Канал Roota в Discord](https://tdm.socprime.com/zeptolink/5IAokHui2iWUHaB8/) для спілкування з іншими, кого цікавить і надихає Roota
142 |
--------------------------------------------------------------------------------
/Roota_Specification.md:
--------------------------------------------------------------------------------
1 | # Roota Specification
2 | :earth_americas: [Українська](Roota_Specification_Ukrainian.md)
3 | * Version 1.0.0
4 | * Release date 2023-10-06
5 |
6 | # Contents
7 | - [Format](#format)
8 | - [Structure](#structure)
9 | - [Fields](#fields)
10 | - [name](#name)
11 | - [details](#details)
12 | - [author](#author)
13 | - [severity](#severity)
14 | - [type](#type)
15 | - [class](#class)
16 | - [date](#date)
17 | - [mitre-attack](#mitre-attack)
18 | - [detection](#detection)
19 | - [language](#language)
20 | - [body](#body)
21 | - [logsource](#logsource)
22 | - [product](#product)
23 | - [log_name](#log_name)
24 | - [class_name](#class_name)
25 | - [category](#category)
26 | - [service](#service)
27 | - [audit](#audit)
28 | - [source](#source)
29 | - [enable](#enable)
30 | - [timeline](#timeline)
31 | - [references](#references)
32 | - [tags](#tags)
33 | - [license](#license)
34 | - [version](#version)
35 | - [uuid](#uuid)
36 | - [correlation](#correlation)
37 | - [timeframe](#timeframe)
38 | - [functions](#functions)
39 | - [response](#response)
40 |
41 | # Format
42 | Roota is structured in the YAML format
43 |
44 | # Structure
45 | ```
46 | name: Rule Name
47 | details: Rule description
48 | author: Rule author
49 | severity: high
50 | type: query
51 | class: behaviour
52 | date: 2020-05-24
53 | mitre-attack:
54 | - t1003.001
55 | - t1136.003
56 | detection:
57 | language: splunk-spl-query # elastic-lucene-query, logscale-lql-query, mde-kql-query
58 | body: index=* ((((process="*comsvcs*") AND (process="*MiniDump*")) OR ((process="*comsvcs*") AND (process="*#24*"))) OR ((process="*comsvcs*") AND (process="*full*")))
59 | logsource:
60 | product: Windows # Sigma or OCSF products
61 | log_name: Security # OCSF log names
62 | class_name: Process Activity # OCSF classes
63 | #category: # Sigma categories
64 | #service: # Sigma services
65 | audit:
66 | source: Windows Security Event Log
67 | enable: Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Detailed Tracking -> Audit Process
68 | timeline: # for Actors and campaigns only
69 | 2022-04-01 - 2022-08-08: Bumblebee
70 | 2022-07-27: KNOTWEED
71 | 2022-12-04: UAC-0082, CERT-UA#4435
72 | references:
73 | - https://badoption.eu/blog/2023/06/21/dumpit.html
74 | tags: Bumblebee, UAC-0082, CERT-UA#4435, KNOTWEED, Comsvcs, cir_ttps, ContentlistEndpoint
75 | license: DRL 1.1
76 | version: 1
77 | uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
78 | #correlation: [] # extended format
79 | #response: [] # extended format
80 | ```
81 |
82 | # Fields
83 |
84 | ## name
85 | Format: `text (max 1024 characters)`
86 |
87 | Required: *mandatory*
88 |
89 | Description: The name of the rule which reflects the goal and the method used in the rule.
90 |
91 | Example: `name: Possible Credential Dumping using comsvcs.dll`
92 |
93 |
94 | ## details
95 | Format: `text (max 8192 characters)`
96 |
97 | Required: *optional*
98 |
99 | Description: A short description of the rule that should give more context to the detection and threats that can be detected with this rule.
100 |
101 | Example: `details: Adversaries can use the built-in library comsvcs.dll to dump credentials on a compromised host.`
102 |
103 |
104 | ## author
105 | Format: `text (max 256 characters)`
106 |
107 | Required: *optional*
108 |
109 | Description: The name of the creator. It is recommended to use the same name for all your rules. Comma-separated value.
110 |
111 | Example: `author: SOC Prime Team`
112 |
113 |
114 | ## severity
115 |
116 | Format: `text (max 16 characters)`
117 |
118 | Required: *optional*
119 |
120 | Description: The severity of the rule which indicates the level of the rule's importance and investigation priority.
121 |
122 | Possible Values:
123 | - `critical` - When critical severity rules are triggered, immediate action is required. Critical rules have a very low probability of false positives, or are highly sensitive actions that must always be deconflicted.
124 | - `high` - When high severity rules are triggered, an investigation/case should be created and completed with a high priority. Low probability of false positives after minimal tuning.
125 | - `medium` - Medium severity rules will likely require tuning in an average environment. After tuning, when medium security rules are triggered, a case should be generated with medium priority.
126 | - `low` - Low severity rules should be used as part of correlations, or to support triage and enrich the analysis environment. Some of these rules may be used as case generators after a significant amount of tuning.
127 |
128 | Example: `severity: medium`
129 |
130 |
131 | ## type
132 | Format: `text (max 16 characters)`
133 |
134 | Required: *optional*
135 |
136 | Description: The type of the rule that indicates whether the rule is intended as a threat hunting 'query' (may generate false positives) or a real-time detection 'alert' (rarely generates false positives).
137 | An alert can be defined as a rule that in the majority of environments will cause a low false positive or true positive - benign rate. For instance, if a rule requires for someone to add domain controllers to filter out benign events, it would NOT be considered an alert.
138 | A query can be defined as any rule that can be expected to require tuning in most environments.
139 |
140 | Possible Values:
141 | - `query`
142 | - `alert`
143 |
144 | Example: `type: query`
145 |
146 | ## class
147 |
148 | Format: `text (max 128 characters)`
149 |
150 | Required: *optional*
151 |
152 | Possible Values:
153 | - `campaign`
154 | - `behavioral`
155 | - `tool`
156 | - `generic`
157 | - `exploit`
158 | - `ioc`
159 |
160 | Description:
161 | - `Exploit Rules`
162 | These are rules meant to identify the exploitation or probing of a vulnerability (e.g. CVE, General SQL-I / XSS Rules). Many of these rules would qualify as "alerts". An example would be a rule built for Log4j detection. These rules are useful indefinitely.
163 |
164 | - `Behavioral Rules`
165 | These rules are meant to identify behaviors that may match an adversary's behavior based on known reporting. Many of these rules would qualify as "queries". An example of a behavioral rule would be a rule that identifies a remote login of a local administrator account. These rules will NOT include information specific to a campaign. These rules are useful retroactively, and on average have a 12+ month expectancy of usefulness.
166 |
167 | - `Campaign Rules`
168 | These rules would be tied to a specific campaign. Many of these rules would qualify as "alerts". For instance, a rule that identifies a campaign by the name of the service that is installed on a Windows host. These rules should help customers identify if they have been the target of a specific campaign. These rules are useful retroactively, and have on average a 3-12 month expectancy of usefulness.
169 |
170 | - `Tool Rules`
171 | These rules identify the usage of a specific tool (offensive, or living off the land). For instance, a rule meant to identify psexec specifically would be a "tool" rule. A rule meant to identify psexec and any similar tool, without explicitly identifying attributes that are unique to those tools would be considered a behavioral rule.
172 |
173 | - `IOC Rule`
174 | Rules that are created for urgent adversary activity that has little to no other detection measures (e.g. wannacry, notpetya, mass & urgent exploitation). Mostly for IOCs like domains, IPs, hashes, URLs.
175 |
176 | - `Generic Rules`
177 | These rules are meant to identify potential weaknesses in an environment. For instance, a rule that identifies weak encryption in Kerberos (RC4_HMAC_MD5). Rules that provide only information that has a very small chance of being a true-positive but is good for customers to keep an eye on. For instance, the root user account of AWS being utilized.
178 |
179 | Example: `class: campaign`
180 |
181 |
182 | ## date
183 |
184 | Format: `YYYY-MM-DD`
185 |
186 | Required: *optional*
187 |
188 | Description: The date of rule creation.
189 |
190 | Example: `date: 2022-10-31`
191 |
192 |
193 | ## mitre-attack
194 |
195 | Format: `text (max 1024 characters)`
196 |
197 | Required: *optional*
198 |
199 | Description: List of MITRE ATT&CK (r) Techniques, Subtechniques, Groups, Software IDs. All IDs should be in lowercase.
200 |
201 | Example:
202 | ```
203 | mitre-attack:
204 | - t1136.003
205 | - t1087.004
206 | - t1069
207 | ```
208 |
209 |
210 | ## detection
211 |
212 | Required: *mandatory*
213 |
214 | Description: This section contains the fields that specify the detection logic and the language used to express it. See the specifications of the fields below.
215 |
216 |
217 | ### language
218 |
219 | Format: `text (max 128 characters)`
220 |
221 | Required: *mandatory*
222 |
223 | Description: The field should specify the name of the SIEM/EDR/XDR in the appropriate format. See the list of supported platforms in the Possible Values section.
224 |
225 | Possible Values:
226 |
227 | - `sentinel-kql-query` for Microsoft Sentinel Query
228 | - `splunk-spl-query` for Splunk Query
229 | - `crowdstrike-spl-query` for CrowdStrike Query
230 | - `elastic-lucene-query` for Elasticsearch Query
231 | - `opensearch-lucene-query` for AWS OpenSearch Query
232 | - `logscale-lql-query` for Falcon LogScale Query
233 | - `mde-kql-query` for Microsoft Defender for Endpoint Query
234 | - `qradar-aql-query` for IBM QRadar Query
235 | - `athena-sql-query` for AWS Athena Query (Security Lake)
236 | - `chronicle-yaral-query` for Chronicle Security Query
237 | - `fortisiem-rule` for FortiSIEM Rule
238 | - `axon-ads-rule` for LogRhythm Axon Rule
239 | - `axon-ads-query` for LogRhythm Axon Query
240 |
241 | Example: `language: splunk-spl-query`
242 |
243 |
244 | ### body
245 |
246 | Format: `text (max 8192 characters)`
247 |
248 | Required: *mandatory*
249 |
250 | Description: This section should contain the rule's logic. It should be a SIEM/EDR/XDR query in the native format. The query should be in one line. In case you have a multiline query, you should join lines before adding it to the Roota rule.
251 |
252 | Example: `index=* source="WinEventLog:*" AND (Image="*.exe" OR Image="*.com")`
253 |
254 |
255 | ## logsource
256 |
257 | Required: *optional*
258 |
259 | Description: This section describes log sources required for the rule. It is optional but could be necessary in some cases when the detection logic doesn’t describe which log sources are required.
260 |
261 |
262 | ### product
263 |
264 | Format: `text (max 128 characters)`
265 |
266 | Required: *optional*
267 |
268 | Description: The product that reported the event.
269 |
270 | Example: `product: windows`
271 |
272 |
273 | ### log_name
274 |
275 | Format: `text (max 128 characters)`
276 |
277 | Required: *optional*
278 |
279 | Description: The event log name. For example, syslog file name or Windows logging subsystem: Security.
280 |
281 | Example: `log_name: Security`
282 |
283 |
284 | ### class_name
285 |
286 | Format: `text (max 128 characters)`
287 |
288 | Required: *optional*
289 |
290 | Description: The OCSF event classes. Details: [https://schema.ocsf.io/1.0.0/classes](https://schema.ocsf.io/1.0.0/classes)
291 |
292 | Example: `class_name: Process Activity`
293 |
294 | ### category
295 |
296 | Format: `text (max 128 characters)`
297 |
298 | Required: *optional*
299 |
300 | Description: A category is used when disparate data sources provide the same type of event logging. For instance, Microsoft Windows 4688 & Sysmon Event ID 1 both provide process creation logs and share many of the same fields. Therefore, we can write and consume rules written generally for "process_creation" instead of rules written specifically for exact data sources. The same goes for most firewalls, proxies, etc.
301 |
302 | Example: `category: process_creation`
303 |
304 |
305 | ### service
306 |
307 | Format: `text (max 128 characters)`
308 |
309 | Required: *optional*
310 |
311 | Description: A service is used when a distinct data source exists for the relevant event logs. As an example, Amazon Cloudtrail eventing is specific to AWS. You generally cannot use a rule made for one service against another data source.
312 |
313 | Example: `service: apache`
314 |
315 |
316 | ## audit
317 |
318 | Required: *optional*
319 |
320 | Description: This section describes in detail what logging service should be enabled to have the logs required for the rule.
321 |
322 |
323 | ### source
324 |
325 | Format: `text (max 128 characters)`
326 |
327 | Required: *optional*
328 |
329 | Description: The full name of the logging provider or logging service that logged the event. For example, Microsoft-Windows-Security-Auditing.
330 |
331 | Example: `source: Microsoft-Windows-PowerShell/Operational`
332 |
333 |
334 | ### enable
335 |
336 | Format: `text (max 2048 characters)`
337 |
338 | Required: *optional*
339 |
340 | Description: This section provides detailed instructions on how to enable the required log audit in the source system.
341 |
342 | Example: `enable: 'Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Detailed Tracking -> Audit Process Creation'`
343 |
344 |
345 | ## timeline
346 |
347 | Format:
348 |
349 | ```
350 | YYYY-MM-DD - YYYY-MM-DD: Actor1, Actor2, TLP:CLEAR
351 | YYYY-MM-DD: Actor1, Actor3, TLP:GREEN
352 | ```
353 |
354 | Required: *optional*
355 |
356 | Description: It has to include the name of the actor, TLP:key, and dates when the behavior described in the Roota rule was used by the Actor. On the contrary to indicators of compromise, which are Actor specific, behaviors are constant while Actor is a variable. If the TLP:key is not defined, it is perceived as TLP:CLEAR. The period can be defined with two dates (first and last seen) or with one date.
357 |
358 | Example:
359 | ```
360 | timeline:
361 | 2023-01-01 - 2023-03-06: Ducktail, MerlinAgent
362 | 2023-02-04: Lazarus
363 | ```
364 |
365 |
366 | ## references
367 |
368 | Format: `text (max 2048 characters)`
369 |
370 | Required: *optional*
371 |
372 | Description: Links to articles in the media, posts, or other sources that describe the threat, exploit, behavior, etc. that the rule detects.
373 |
374 | Example:
375 | ```
376 | references:
377 | - https://badoption.eu/blog/2023/06/21/dumpit.html
378 | ```
379 |
380 |
381 | ## tags
382 |
383 | Format: `text (max 1024 characters)`
384 |
385 | Required: *optional*
386 |
387 | Description: Comma-separated short words that can label Roota rule for keyword search.
388 |
389 | Example: `tags: MerlinAgent, UAC-0173, UAC-0006, Ducktail, CERT-UA#4753`
390 |
391 |
392 | ## license
393 | Format: `text (max 256 characters)`
394 |
395 | Required: *optional*
396 |
397 | Description: The license of the rule. It can also contain a link to the license file.
398 |
399 | Example: `license: DRL 1.1`
400 |
401 |
402 | ## version
403 | Format: `X.X (major.minor version number)`
404 |
405 | Required: *optional*
406 |
407 | Description: The unique version number of the rule.
408 |
409 | Example: `version: 0.1`
410 |
411 |
412 | ## uuid
413 | Format: `text (32 characters)`
414 |
415 | Required: *optional*
416 |
417 | Description: Unique ID of the rule. UUID version 4 is recommended for use.
418 |
419 | Example: `uuid: 009a001b-1623-4320-8369-95bf0d651e8e`
420 |
421 | ## correlation
422 | Required: *optional*
423 |
424 | Description: The correlation section is responsible for the correlation of query results.
425 |
426 | Example:
427 | ```
428 | correlation:
429 | timeframe: 1m
430 | functions: count() > 10
431 | ```
432 |
433 | ### timeframe
434 | Format: `text (8 characters)`
435 |
436 | Required: *optional*
437 |
438 | Description: A time frame for the functions, which is defined as a span of seconds (s), minutes (m), hours (h), days (d), and weeks(w).
439 |
440 | Example: `timeframe: 1m`
441 |
442 | ### functions
443 | Format: `text (128 characters)`
444 |
445 | Required: *optional*
446 |
447 | Description: Functions can be used for correlation of query results, for example, to trigger only in case certain thresholds of certain fields are met. This is still under development. First functions to be released:
448 |
449 | - `count()` - count of field values
450 | - `by` - group by field
451 | - `dcount` - unique field values
452 |
453 | Example: `functions: count() > 10`
454 |
455 |
456 | ## response
457 | Reserved for future
458 |
--------------------------------------------------------------------------------
/Roota_Specification_Ukrainian.md:
--------------------------------------------------------------------------------
1 | # Специфікація Roota
2 | :earth_americas: [English](Roota_Specification.md)
3 | * Версія 1.0.0
4 | * Дата релізу 2023-10-06
5 | # Зміст
6 | - [Формат](#формат)
7 | - [Структура](#структура)
8 | - [Поля](#поля)
9 | - [name](#name)
10 | - [details](#details)
11 | - [author](#author)
12 | - [severity](#severity)
13 | - [type](#type)
14 | - [class](#class)
15 | - [date](#date)
16 | - [mitre-attack](#mitre-attack)
17 | - [detection](#detection)
18 | - [language](#language)
19 | - [body](#body)
20 | - [logsource](#logsource)
21 | - [product](#product)
22 | - [log_name](#log_name)
23 | - [class_name](#class_name)
24 | - [category](#category)
25 | - [service](#service)
26 | - [audit](#audit)
27 | - [source](#source)
28 | - [enable](#enable)
29 | - [timeline](#timeline)
30 | - [references](#references)
31 | - [tags](#tags)
32 | - [license](#license)
33 | - [version](#version)
34 | - [uuid](#uuid)
35 | - [correlation](#correlation)
36 | - [timeframe](#timeframe)
37 | - [functions](#functions)
38 | - [response](#response)
39 |
40 | # Формат
41 | У Roota використовується формат YAML.
42 |
43 | # Структура
44 | ```
45 | name: Rule Name
46 | details: Rule description
47 | author: Rule author
48 | severity: high
49 | type: query
50 | class: behaviour
51 | date: 2020-05-24
52 | mitre-attack:
53 | - t1003.001
54 | - t1136.003
55 | detection:
56 | language: splunk-spl-query # elastic-lucene-query, logscale-lql-query, mde-kql-query
57 | body: index=* ((((process="*comsvcs*") AND (process="*MiniDump*")) OR ((process="*comsvcs*") AND (process="*#24*"))) OR ((process="*comsvcs*") AND (process="*full*")))
58 | logsource:
59 | product: Windows # Sigma or OCSF products
60 | log_name: Security # OCSF log names
61 | class_name: Process Activity # OCSF classes
62 | #category: # Sigma categories
63 | #service: # Sigma services
64 | audit:
65 | source: Windows Security Event Log
66 | enable: Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Detailed Tracking -> Audit Process
67 | timeline: # for Actors and campaigns only
68 | 2022-04-01 - 2022-08-08: Bumblebee
69 | 2022-07-27: KNOTWEED
70 | 2022-12-04: UAC-0082, CERT-UA#4435
71 | references:
72 | - https://badoption.eu/blog/2023/06/21/dumpit.html
73 | tags: Bumblebee, UAC-0082, CERT-UA#4435, KNOTWEED, Comsvcs, cir_ttps, ContentlistEndpoint
74 | license: DRL 1.1
75 | version: 1
76 | uuid: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
77 | #correlation: [] # extended format
78 | #response: [] # extended format
79 | ```
80 |
81 | # Поля
82 |
83 | ## name
84 | Формат: `текст (макс. 1024 символи)`
85 |
86 | Чи є обов'язковим: *обов'язкове*
87 |
88 | Опис: Назва правила, яка показує, що і яким чином воно виявляє.
89 |
90 | Приклад: `name: Possible Credential Dumping using comsvcs.dll`
91 |
92 |
93 | ## details
94 | Формат: `текст (макс. 8192 символи)`
95 |
96 | Чи є обов'язковим: *не обов'язкове*
97 |
98 | Опис: Короткий опис правила, який містить додатковий контекст щодо роботи алгоритму та загроз, які це правило може виявити.
99 |
100 | Приклад: `details: Adversaries can use the built-in library comsvcs.dll to dump credentials on a compromised host.`
101 |
102 |
103 | ## author
104 | Формат: `текст (макс. 256 символів)`
105 |
106 | Чи є обов'язковим: *не обов'язкове*
107 |
108 | Опис: Ім'я того, хто створив правило. Авторам рекомендується використовувати одне й те саме ім'я для всіх своїх правил. Якщо значень декілька, вони подаються через кому.
109 |
110 | Приклад: `author: SOC Prime Team`
111 |
112 |
113 | ## severity
114 |
115 | Формат: `текст (макс. 16 символів)`
116 |
117 | Чи є обов'язковим: *не обов'язкове*
118 |
119 | Опис: Рівень критичності правила, який показує його значимість і пріоритет розслідування у разі його спрацювання.
120 |
121 | Можливі значення:
122 | - `critical` (критичний). Коли спрацьовують правила з рівнем критичності 'critical', необхідно терміново вжити дій. У таких правил дуже низька ймовірність хибнопозитивного спрацьовування, або ж вони пов'язані з надважливими діями, яким завжди треба приділяти першочергову увагу для запобігання негативним наслідкам.
123 | - `high` (високий). Коли спрацьовують правила з високим рівнем критичності, необхідно відкрити й провести розслідування із високим пріоритетом. Такі правила мають низьку ймовірність хибнопозитивного спрацьовування після мінімального додаткового налаштування.
124 | - `medium` (середній). Правила з середнім рівнем критичності зазвичай потребують додаткового налаштування. Якщо після налаштування таке правило спрацьовує, потрібно створювати тікет із середнім пріоритетом.
125 | - `low` (низький). Правила з низьким рівнем критичності слід використовувати в кореляціях або для цілей розслідування й отримання додаткових даних для аналізу. Деякі з таких правил можна використовувати для створення тікетів після суттєвого додаткового налаштування.
126 |
127 | Приклад: `severity: medium`
128 |
129 |
130 | ## type
131 | Формат: `текст (макс. 16 символів)`
132 |
133 | Чи є обов'язковим: *не обов'язкове*
134 |
135 | Опис: Тип правила, який показує його призначення: `query` – запит для трет-хантінгу (може давати хибнопозитивні результати) або `alert` – правило для генерації сповіщень в реальному часі (рідко дає хибнопозитивні результати).
136 | Тип `alert` застосовується до правил, які в більшості середовищ матимуть низький рівень хибнопозитивних спрацьовувань або істинопозитивних спрацьовувань, що викликані нешкідливою активністю. Наприклад, якщо для правила потрібно, щоб хтось додав контроллери доменів для відфільтровування нешкідливих подій, його НЕ можна кваліфікувати як `alert`.
137 | Тип `query` застосовується до будь-якого правила, яке з високою ймовірністю доведеться додатково налаштовувати в більшості середовищ.
138 |
139 | Можливі значення:
140 | - `query`
141 | - `alert`
142 |
143 | Приклад: `type: query`
144 |
145 | ## class
146 |
147 | Формат: `текст (макс. 128 символів)`
148 |
149 | Чи є обов'язковим: *не обов'язкове*
150 |
151 | Можливі значення:
152 | - `campaign`
153 | - `behavioral`
154 | - `tool`
155 | - `generic`
156 | - `exploit`
157 | - `ioc`
158 |
159 | Опис:
160 | - `exploit` – правила для виявлення експлойтів
161 | Ці правила покликані виявляти експлуатацію вразливості або спробу її знайти (наприклад, CVE, загальні правила для виявлення SQL-I / XSS). Багато таких правил можна кваліфікувати як 'alert'. Як приклад, можна навести правило для детектування Log4j. Ці правила залишаються корисними необмежений час.
162 |
163 | - `behavioral` – правила для виявлення поведінки
164 | Ці правила призначені для виявлення патернів поведінки, що збігаються з поведінкою зловмисників, відомою по звітам про минулі інциденти. Багато таких правил можна кваліфікувати як 'query`. Прикладом правила для виявлення поведінки може бути правило, яке виявляє віддалений вхід у систему з локального акаунту адмністратора. Такі правила НЕ включають інформацію, специфічну для певної кампанії. Вони мають користь при ретроспективному застосуванні й у середньому залишаються корисними не менше 12 мсяців.
165 |
166 | - `campaign` – правила для виявлення кампаній
167 | Ці правила прив'язані до конкретної кампанії. Багато таких правил можна кваліфікувати як 'alert'. Як приклад можна навести правило, що виявляє кампанію за назвою сервісу, встановленого на хості Windows. Ці правила мають допомагати клієнтам визначити, чи є вони ціллю певної кампанії. Вони мають користь при ретроспективному застосуванні й у середньому залишаються корисними 3–12 місяців.
168 |
169 | - `tool` – правила для виявлення інструментів
170 | Ці правила виявляють використання конкретного інструмента (призначеного для кібератак або легітимного, який використовується у злочинних цілях). Як приклад можна навести правило, яке виявляє psexec. Правило, покликане виявляти psexec і будь-які подібні інструменти, де напряму не визначено характеристики, унікальні для таких інструментів, кваліфікується як правило для визначення поведінки.
171 |
172 | - `ioc`– правила для визначення індикаторів компрометації
173 | Правила, створені для виявлення новітніх дій зловмисників, для детектування яких не існує або майже не існує інших засобів (наприклад, wannacry, notpetya, масова експлуатація новітніми методами). Більшою частиною для індикаторів компрометації (IOC), таких як домени, IP-адреси, хеші, URL.
174 |
175 | - `generic` – загальні правила
176 | Ці правила призначені для виявлення потенційних слабких місць у середовищі. Як приклад можна навести правило, яке виявляє слабке шифрування в Kerberos (RC4_HMAC_MD5). Ці правила дозволяють отримати інформацію, яка з дуже низькою ймовірністю буде істинопозитивним результатом, але клієнтам корисно її знати. Наприклад, використання акаунта root-юзера в AWS.
177 |
178 | Приклад: `class: campaign`
179 |
180 |
181 | ## date
182 |
183 | Format: `YYYY-MM-DD`
184 |
185 | Чи є обов'язковим: *не обов'язкове*
186 |
187 | Опис: Дата створення правила.
188 |
189 | Приклад: `date: 2022-10-31`
190 |
191 |
192 | ## mitre-attack
193 |
194 | Формат: `текст (макс. 1024 символи)`
195 |
196 | Чи є обов'язковим: *не обов'язкове*
197 |
198 | Опис: перелік ідентифікаторів технік, підтехнік, груп та програмного забезпечення за системою MITRE ATT&CK(r). Усі ідентифікатори мають бути в нижньому регістрі.
199 |
200 | Приклад:
201 | ```
202 | mitre-attack:
203 | - t1136.003
204 | - t1087.004
205 | - t1069
206 | ```
207 |
208 |
209 | ## detection
210 |
211 | Чи є обов'язковим: *обов'язкове*
212 |
213 | Опис: Ця секція містить поля, в яких задано логіку детектування і мову, якою вона написана. Див. специфікацію цих полів нижче.
214 |
215 |
216 | ### language
217 |
218 | Формат: `текст (макс. 128 символів)`
219 |
220 | Чи є обов'язковим: *обов'язкове*
221 |
222 | Опис: Це поле містить назву SIEM/EDR/XDR у відповідному форматі. Див. перелік підтримуваних платформ у розділі "Можливі значення".
223 |
224 | Можливі значення:
225 |
226 | - `sentinel-kql-query` для Microsoft Sentinel Query
227 | - `splunk-spl-query` для Splunk Query
228 | - `crowdstrike-spl-query` для CrowdStrike Query
229 | - `elastic-lucene-query` для Elasticsearch Query
230 | - `opensearch-lucene-query` для AWS OpenSearch Query
231 | - `logscale-lql-query` для Falcon LogScale Query
232 | - `mde-kql-query` для Microsoft Defender for Endpoint Query
233 | - `qradar-aql-query` для IBM QRadar Query
234 | - `athena-sql-query` для AWS Athena Query (Security Lake)
235 | - `chronicle-yaral-query` для Chronicle Security Query
236 | - `fortisiem-rule` for FortiSIEM Rule
237 | - `axon-ads-rule` for LogRhythm Axon Rule
238 | - `axon-ads-query` for LogRhythm Axon Query
239 |
240 | Приклад: `language: splunk-spl-query`
241 |
242 |
243 | ### body
244 |
245 | Формат: `текст (макс. 8192 символи)`
246 |
247 | Чи є обов'язковим: *обов'язкове*
248 |
249 | Опис: Ця секція містить логику правила. Це має бути запит у нативному форматі певної системи SIEM/EDR/XDR. Запит має складатися з одного рядка. Якщо запит складається з декількох рядків, об'єднайте їх, перш ніж додавати в правило Roota.
250 |
251 | Приклад: `index=* source="WinEventLog:*" AND (Image="*.exe" OR Image="*.com")`
252 |
253 |
254 | ## logsource
255 |
256 | Чи є обов'язковим: *не обов'язкове*
257 |
258 | Опис: Ця секція описує джерела логів, потрібні для роботи правила. Вона не обов'язкова, але може бути необхідною у випадках, коли логіка детектування не описує потрібні джерела логів.
259 |
260 |
261 | ### product
262 |
263 | Формат: `текст (макс. 128 символів)`
264 |
265 | Чи є обов'язковим: *не обов'язкове*
266 |
267 | Опис: Продукт, від якого надійшли дані про подію.
268 |
269 | Приклад: `product: windows`
270 |
271 |
272 | ### log_name
273 |
274 | Формат: `текст (макс. 128 символів)`
275 |
276 | Чи є обов'язковим: *не обов'язкове*
277 |
278 | Опис: Назва логу події. Наприклад, назва файлу syslog або підсистеми логування Windows: Security.
279 |
280 | Приклад: `log_name: Security`
281 |
282 |
283 | ### class_name
284 |
285 | Формат: `текст (макс. 128 символів)`
286 |
287 | Чи є обов'язковим: *не обов'язкове*
288 |
289 | Опис: Класи подій за OCSF. Детальний опис можна знайти тут: [https://schema.ocsf.io/1.0.0/classes](https://schema.ocsf.io/1.0.0/classes)
290 |
291 | Приклад: `class_name: Process Activity`
292 |
293 | ### category
294 |
295 | Формат: `текст (макс. 128 символів)`
296 |
297 | Чи є обов'язковим: *не обов'язкове*
298 |
299 | Опис: Категорія використовується, коли різні джерела даних забезпечують той самий тип логування подій. Наприклад, Microsoft Windows 4688 та Sysmon Event ID 1 обидва логують створення процесів і мають багато спільних полів. Тож, можна створювати й використовувати правила, написані під загальну категорію "process_creation", а не конкретне джерело даних. Це також стосується більшості фаєрволів, проксі, тощо.
300 |
301 | Приклад: `category: process_creation`
302 |
303 |
304 | ### service
305 |
306 | Формат: `текст (макс. 128 символів)`
307 |
308 | Чи є обов'язковим: *не обов'язкове*
309 |
310 | Опис: Сервіс використовується, коли для необхідних логів подій існує конкретне джерело даних. Наприклад, події Amazon Cloudtrail логуються лише в AWS. Зазвичай правило, написане під певний сервіс, не можна використати з іншим джерелом даних.
311 |
312 | Приклад: `service: apache`
313 |
314 |
315 | ## audit
316 |
317 | Чи є обов'язковим: *не обов'язкове*
318 |
319 | Опис: Ця секція містить докладний опис того, які сервіси логування необхідно ввімкнути, щоб мати логи, необхідні для даного правила.
320 |
321 |
322 | ### source
323 |
324 | Формат: `текст (макс. 128 символів)`
325 |
326 | Чи є обов'язковим: *не обов'язкове*
327 |
328 | Опис: Повна назва постачальника логів або сервісу логування, які записують подію. Наприклад, Microsoft-Windows-Security-Auditing.
329 |
330 | Приклад: `source: Microsoft-Windows-PowerShell/Operational`
331 |
332 |
333 | ### enable
334 |
335 | Формат: `текст (макс. 2048 символів)`
336 |
337 | Чи є обов'язковим: *не обов'язкове*
338 |
339 | Опис: Ця секція містить докладні вказівки, як увімкнути запис необхідних логів аудиту в системі-джерелі.
340 |
341 | Приклад: `enable: 'Computer Configuration -> Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> System Audit Policies -> Detailed Tracking -> Audit Process Creation'`
342 |
343 |
344 | ## timeline
345 |
346 | Формат:
347 |
348 | ```
349 | YYYY-MM-DD - YYYY-MM-DD: Актор1, Актор2, TLP:CLEAR
350 | YYYY-MM-DD: Актор1, Актор3, TLP:GREEN
351 | ```
352 |
353 | Чи є обов'язковим: *не обов'язкове*
354 |
355 | Опис: Має включати ім'я актора, маркування за протоколом TLP і дати, коли актор проявляв поведінку, описану в правилі Roota. На відміну від індикаторів компрометації, які є специфічними для актора, одні й ті самі патерни поведінки можуть застосовуватися різними акторами. Якщо маркування за протоколом TLP не задано, то вважається, що воно має значення TLP:CLEAR. Період може задаватися двома датами (перше й останнє проявлення) або однією датою.
356 |
357 | Приклад:
358 | ```
359 | timeline:
360 | 2023-01-01 - 2023-03-06: Ducktail, MerlinAgent
361 | 2023-02-04: Lazarus
362 | ```
363 |
364 |
365 | ## references
366 |
367 | Формат: `текст (макс. 2048 символів)`
368 |
369 | Чи є обов'язковим: *не обов'язкове*
370 |
371 | Опис: Посилання на статті у ЗМІ, публікації або інші джерела, які описують загрозу, експлойт, поведінку, тощо, які виявляє правило.
372 |
373 | Приклад:
374 | ```
375 | references:
376 | - https://badoption.eu/blog/2023/06/21/dumpit.html
377 | ```
378 |
379 |
380 | ## tags
381 |
382 | Формат: `текст (макс. 1024 символи)`
383 |
384 | Чи є обов'язковим: *не обов'язкове*
385 |
386 | Опис: Короткі слова, подані через кому, які позначають правило Roota для пошуку за ключовими словами.
387 |
388 | Приклад: `tags: MerlinAgent, UAC-0173, UAC-0006, Ducktail, CERT-UA#4753`
389 |
390 |
391 | ## license
392 | Формат: `текст (макс. 256 символів)`
393 |
394 | Чи є обов'язковим: *не обов'язкове*
395 |
396 | Опис: Ліцензія правила. Також може містити посилання на файл з ліцензією.
397 |
398 | Приклад: `license: DRL 1.1`
399 |
400 |
401 | ## version
402 | Формат: `X.X (суттєвий.несуттєвий номер версії)`
403 |
404 | Чи є обов'язковим: *не обов'язкове*
405 |
406 | Опис: Унікальний номер версії правила.
407 |
408 | Приклад: `version: 0.1`
409 |
410 |
411 | ## uuid
412 | Формат: `текст (32 символи)`
413 |
414 | Чи є обов'язковим: *не обов'язкове*
415 |
416 | Опис: Унікальний ідентифікатор правила. Рекомендується використовувати UUID версії 4.
417 |
418 | Приклад: `uuid: 009a001b-1623-4320-8369-95bf0d651e8e`
419 |
420 | ## correlation
421 | Чи є обов'язковим: *не обов'язкове*
422 |
423 | Опис: У цій секції виконується кореляція результатів запиту.
424 |
425 | Приклад:
426 | ```
427 | correlation:
428 | timeframe: 1m
429 | functions: count() > 10
430 | ```
431 |
432 | ### timeframe
433 | Формат: `текст (8 символів)`
434 |
435 | Чи є обов'язковим: *не обов'язкове*
436 |
437 | Опис: Період часу для функцій, який задається у секундах (s), хвилинах (m), годинах (h), днях (d) або тижнях (w).
438 |
439 | Приклад: `timeframe: 1m`
440 |
441 | ### functions
442 | Формат: `текст (128 символів)`
443 |
444 | Чи є обов'язковим: *не обов'язкове*
445 |
446 | Опис: Функції можна використовувати для кореляції результатів запиту, наприклад, щоб правило спрацьовувало, лише якщо досягаються певні граничні значення певних полів. Це поле все ще в розробці. Першими будуть реалізовані такі функції:
447 |
448 | - `count()` – кількість значень поля
449 | - `by` – групування по полю
450 | - `dcount` – унікальні значення поля
451 |
452 | Приклад: `functions: count() > 10`
453 |
454 |
455 | ## response
456 | Зарезервовано на майбутнє.
457 |
--------------------------------------------------------------------------------