assemblyline_models/datastore/
alert.rs1
2use std::collections::HashMap;
3
4use chrono::{DateTime, Utc};
5use serde::{Deserialize, Serialize};
6use serde_with::{SerializeDisplay, DeserializeFromStr};
7use struct_metadata::Described;
8
9use crate::types::{Wildcard, Domain, ExpandingClassification, Sha1, Sha256, Uri, Uuid, MD5};
10use crate::ElasticMeta;
11use super::workflow::{Statuses, Priorities};
12
13
14#[derive(SerializeDisplay, DeserializeFromStr, strum::Display, strum::EnumString, Described, Debug)]
15#[metadata_type(ElasticMeta)]
16#[strum(serialize_all = "lowercase")]
17pub enum ExtendedScanValues {
18 Submitted,
19 Skipped,
20 Incomplete,
21 Complete,
22}
23
24#[derive(SerializeDisplay, DeserializeFromStr, strum::Display, strum::EnumString, Described)]
25#[metadata_type(ElasticMeta)]
26#[strum(serialize_all = "lowercase")]
27pub enum ItemVerdict {
28 Safe,
29 Info,
30 Suspicious,
31 Malicious,
32}
33
34#[derive(SerializeDisplay, DeserializeFromStr, strum::Display, strum::EnumString, Described)]
35#[metadata_type(ElasticMeta)]
36#[strum(serialize_all = "lowercase")]
37pub enum EntityType {
38 User,
39 Workflow,
40}
41
42
43#[derive(SerializeDisplay, DeserializeFromStr, strum::Display, strum::EnumString, Described)]
44#[metadata_type(ElasticMeta)]
45#[strum(serialize_all = "UPPERCASE")]
46pub enum Subtype {
47 Exp,
48 Cfg,
49 Ob,
50 Imp,
51 Ta,
52}
53
54
55#[derive(Serialize, Deserialize, Described)]
57#[metadata_type(ElasticMeta)]
58#[metadata(index=true, store=false)]
59pub struct DetailedItem {
60 #[serde(rename = "type")]
62 pub item_type: String,
63 pub value: String,
65 pub verdict: ItemVerdict,
67 pub subtype: Option<Subtype>,
69}
70
71#[derive(Serialize, Deserialize, Described)]
73#[metadata_type(ElasticMeta)]
74#[metadata(index=true, store=false)]
75pub struct DetailedResults {
76 #[serde(default)]
78 pub attack_pattern: Vec<DetailedItem>,
79 #[serde(default)]
81 pub attack_category: Vec<DetailedItem>,
82 #[serde(default)]
84 pub attrib: Vec<DetailedItem>,
85 #[serde(default)]
87 pub av: Vec<DetailedItem>,
88 #[serde(default)]
90 pub behavior: Vec<DetailedItem>,
91 #[serde(default)]
93 pub domain: Vec<DetailedItem>,
94 #[serde(default)]
96 pub heuristic: Vec<DetailedItem>,
97 #[serde(default)]
99 pub ip: Vec<DetailedItem>,
100 #[serde(default)]
102 pub uri: Vec<DetailedItem>,
103 #[serde(default)]
105 pub yara: Vec<DetailedItem>,
106}
107
108#[derive(Serialize, Deserialize, Described)]
110#[metadata_type(ElasticMeta)]
111#[metadata(index=true, store=false)]
112pub struct ALResults {
113 #[serde(default)]
115 #[metadata(store=true, copyto="__text__")]
116 pub attrib: Vec<String>,
117 #[serde(default)]
119 #[metadata(store=true, copyto="__text__")]
120 pub av: Vec<String>,
121 #[serde(default)]
123 #[metadata(copyto="__text__")]
124 pub behavior: Vec<String>,
125 pub detailed: DetailedResults,
127 #[serde(default)]
129 #[metadata(copyto="__text__")]
130 pub domain: Vec<Domain>,
131 #[serde(default)]
133 pub domain_dynamic: Vec<Domain>,
134 #[serde(default)]
136 pub domain_static: Vec<Domain>,
137 #[serde(default)]
139 #[metadata(copyto="__text__")]
140 pub ip: Vec<std::net::IpAddr>,
141 #[serde(default)]
143 pub ip_dynamic: Vec<std::net::IpAddr>,
144 #[serde(default)]
146 pub ip_static: Vec<std::net::IpAddr>,
147 #[serde(default)]
149 #[metadata(index=false)]
150 pub request_end_time: DateTime<Utc>,
151 #[serde(default)]
153 #[metadata(store=true)]
154 pub score: i32,
155 #[serde(default)]
157 #[metadata(copyto="__text__")]
158 pub uri: Vec<Uri>,
159 #[serde(default)]
161 pub uri_dynamic: Vec<Uri>,
162 #[serde(default)]
164 pub uri_static: Vec<Uri>,
165 #[serde(default)]
167 #[metadata(copyto="__text__")]
168 pub yara: Vec<String>,
169}
170
171#[derive(Serialize, Deserialize, Described)]
173#[metadata_type(ElasticMeta)]
174#[metadata(index=true, store=true)]
175pub struct File {
176 #[metadata(copyto="__text__")]
178 pub md5: MD5,
179 #[metadata(copyto="__text__")]
181 pub name: String,
182 #[metadata(copyto="__text__")]
184 pub sha1: Sha1,
185 #[metadata(copyto="__text__")]
187 pub sha256: Sha256,
188 #[metadata(store=false)]
190 pub size: i64,
191 #[serde(rename = "type")]
193 #[metadata(copyto="__text__")]
194 pub file_type: String,
195 #[serde(default)]
197 pub screenshots: Vec<Screenshot>,
198}
199
200#[derive(Serialize, Deserialize, Described)]
202#[metadata_type(ElasticMeta)]
203#[metadata(index=true, store=false)]
204pub struct Screenshot {
205 pub name: String,
207 pub description: String,
209 pub img: Sha256,
211 pub thumb: Sha256,
213}
214
215#[derive(Serialize, Deserialize, Default, Described)]
217#[metadata_type(ElasticMeta)]
218#[metadata(index=true, store=false)]
219pub struct Verdict {
220 #[serde(default)]
222 pub malicious: Vec<String>,
223 #[serde(default)]
225 pub non_malicious: Vec<String>,
226}
227
228#[derive(Serialize, Deserialize, Described)]
230#[metadata_type(ElasticMeta)]
231#[metadata(index=true, store=false)]
232pub struct Heuristic {
233 #[serde(default)]
235 pub name: Vec<String>,
236}
237
238#[derive(Serialize, Deserialize, Described)]
240#[metadata_type(ElasticMeta)]
241#[metadata(index=true, store=false)]
242pub struct Attack {
243 #[serde(default)]
245 pub pattern: Vec<String>,
246 #[serde(default)]
248 pub category: Vec<String>,
249}
250
251#[derive(Serialize, Deserialize, Described)]
253#[metadata_type(ElasticMeta)]
254#[metadata(index=true, store=false)]
255pub struct Event {
256 pub entity_type: EntityType,
258 pub entity_id: String,
260 pub entity_name: String,
262 #[serde(default="chrono::Utc::now")]
264 pub ts: DateTime<Utc>,
265 #[serde(default)]
267 pub labels: Vec<String>,
268 #[serde(default)]
270 pub labels_removed: Vec<String>,
271 #[serde(default)]
273 pub status: Option<Statuses>,
274 #[serde(default)]
276 pub priority: Option<Priorities>,
277}
278
279#[derive(Serialize, Deserialize, Described)]
281#[metadata_type(ElasticMeta)]
282#[metadata(index=true, store=true)]
283pub struct Relationship {
284 pub child: Uuid,
286 #[serde(default)]
288 pub parent: Option<Uuid>,
289}
290
291#[derive(Serialize, Deserialize, Described)]
293#[metadata_type(ElasticMeta)]
294#[metadata(index=true, store=true)]
295pub struct Alert {
296 #[metadata(copyto="__text__")]
298 pub alert_id: String,
299 pub al: ALResults,
301 pub archive_ts: Option<chrono::DateTime<chrono::Utc>>,
303 pub attack: Attack,
305 #[serde(flatten)]
307 pub classification: ExpandingClassification,
308 #[metadata(store=false)]
310 pub expiry_ts: Option<DateTime<Utc>>,
311 pub extended_scan: ExtendedScanValues,
313 pub file: File,
315 #[serde(default)]
317 pub filtered: bool,
318 pub heuristic: Heuristic,
320 #[serde(default)]
322 #[metadata(copyto="__text__")]
323 pub label: Vec<String>,
324 #[serde(default)]
326 #[metadata(store=false, mapping="flattenedobject", copyto="__text__")]
327 pub metadata: HashMap<String, Wildcard>,
328 pub owner: Option<String>,
330 pub priority: Option<Priorities>,
332 pub reporting_ts: DateTime<Utc>,
334 pub submission_relations: Vec<Relationship>,
336 pub sid: String,
338 pub status: Option<Statuses>,
340 pub ts: DateTime<Utc>,
342 #[serde(rename = "type")]
344 pub alert_type: String,
345 #[serde(default)]
347 pub verdict: Verdict,
348 #[serde(default)]
350 pub events: Vec<Event>,
351 #[serde(default)]
353 pub workflows_completed: bool,
354}