CEFParser
Parse CEF data into the context. Please notice that outputs will display only the 7 mandatory fields even if the CEF event includes many other custom or extended fields.
javascript · Common Scripts
Source
// Consts var mandatoryLabels = ['cefVersion', 'vendor', 'product', 'version', 'signatureID', 'name', 'severity']; // first, split the lines for multiple CEF rows var rows = args.data.split('\nCEF:'); var data = []; for (var i=0; i<rows.length; i++) { var o = {}; // First, read the mandatory fields var start = 0; for (var j=0; j<mandatoryLabels.length; j++) { var end = rows[i].indexOf('|', start); if (end < 0) { throw 'Invalid format in row ' + i + '. Missing mandatory field ' + j + '.'; } // Ignore escaped separators while (rows[i][end-1] === '\\') { end = rows[i].indexOf('|', end + 1); if (end < 0) { throw 'Invalid format in row ' + i + '. Missing mandatory field ' + j + '.'; } } o[mandatoryLabels[j]] = (i === 0 && j === 0) ? rows[i].substring(4, end) : rows[i].substring(start, end); start = end + 1; } // Now, handle extensions which should be separated by '=' var currLabel = ''; var eq = rows[i].indexOf('=', start); while (eq > 0) { if (rows[i][eq-1] === '\\') { eq = rows[i].indexOf('=', eq + 1); continue; } // We found a good '=', now need to go back and find the beginning of the label for (var b=eq-1; b>start; b--) { if (rows[i][b] === ' ') { b++; break; } } if (currLabel === '') { currLabel = rows[i].substring(b, eq); start = eq + 1; } else { o[currLabel] = rows[i].substring(start, b).trim(); currLabel = rows[i].substring(b, eq); start = eq + 1; } eq = rows[i].indexOf('=', start); } if (currLabel !== '' && start < rows[i].length - 1) { o[currLabel] = rows[i].substring(start); } // Convert labels of custom fields to actual attributes (cs1Label, cn1Label, cs1, cn1) var keys = Object.keys(o); for (var k=0; k<keys.length; k++) { if (keys[k].match(/c[ns]\d+Label/i) && keys.indexOf(keys[k].substring(0, keys[k].length-5)) >= 0) { o[o[keys[k]]] = o[keys[k].substring(0, keys[k].length-5)]; delete o[keys[k]]; delete o[keys[k].substring(0, keys[k].length-5)]; } } data.push(o); } return {Type: entryTypes.note, Contents: data, ContentsFormat: formats.json, HumanReadable: tableToMarkdown('CEF Events', data), EntryContext: {CEFEvent: data}};
README
Parses CEF data into the context. Outputs will display only the 7 mandatory fields even if the CEF event includes many other custom or extended fields.
Script Data
| Name | Description |
|---|---|
| Script Type | javascript |
| Tags | Utility |
Inputs
| Argument Name | Description |
|---|---|
| data | The data that contains the CEF rows. |
Outputs
| Path | Description | Type |
|---|---|---|
| CEFEvent.cefVersion | The CEF version. | Unknown |
| CEFEvent.vendor | The product vendor. | Unknown |
| CEFEvent.product | The product name. | Unknown |
| CEFEvent.version | The product version. | Unknown |
| CEFEvent.signatureID | The signature ID for the alert, if relevant. | Unknown |
| CEFEvent.name | The alert name. | Unknown |
| CEFEvent.severity | The alert severity. | Unknown |