SecOps · VRO Lab

Practical SecOps + Vulnerability Response (VRO) — From Scratch

Visual boards first: SIR + VR + TI + CTD, the full scanner-to-close cycle, table map, instance URLs, PDI labs, Flow Designer hooks, and SDK boundaries.

AudienceSOC analyst · VR implementer
InstancePDI with SecOps plugins
Replace{BASE}
Deep divemodules/SECOPS.html
Lab quick open (apply {BASE} once at top) Guided Setup VR Workspace SIR Workspace Vulnerable Items Flow Designer IH Spokes CMDB Servers

How to use this tutorial (3 minutes to orient)

Follow each dark flow left→right · open matching screen mockups · click url-box links on your PDI · run stepboard labs in order · use green/red chips as gates before go-live.

§1 — SecOps overview: SIR + VR + TI + CTD

At a glance — one platform, four missions

SIR

Security Incident Response — cases, MITRE, playbooks, containment tasks tied to CIs and IoCs.

VR / VRO

Vulnerability Response — CVE master, per-asset vulnerable items, assignment, remediation change, verify, close.

TI + CTD

Threat Intelligence (IoC/STIX) + Configuration Compliance (CIS/SCAP) feeding prioritization and SIR enrichment.

SCANQualys / Tenable
→
VRsn_vul_*
→
CMDBcmdb_ci
↔
SIEMSplunk / QRadar
→
SIRsn_si_incident
↔
TIsn_ti_indicator
→
CTDsn_vul_ctd_*

SIR — Security Incident Response

  • Plugin: com.snc.security_incident
  • Tables: sn_si_incident, tasks, observables
  • Workspace: SIR agent / analyst view
  • Automation: Playbooks (Workflow Studio), not legacy WF for new
Open SIR workspace →

VR — Vulnerability Response (VRO)

  • Plugin: com.snc.vulnerability
  • Master + item: sn_vul_vulnerability, sn_vul_vulnerable_item
  • Import: IntegrationHub spokes + import sets
  • Outcome: Change / remediation task → closed VI
Open VR workspace →

TI + CTD

  • TI: com.snc.threat.intel — indicators, feeds
  • CTD: com.snc.sn_vul_config_test — benchmarks
  • Cross-link: exploit intel → VR priority; CTD fail → VI
  • Roles: separate from ITSM admin — use SecOps groups
Open TI indicators →
AppPrimary personaTypical entryPlugin (activate on PDI)
SIRSOC tier 1–3{BASE}/now/sir/workspacecom.snc.security_incident
VR / VROVuln manager · patch owner{BASE}/now/vulnerability/overviewcom.snc.vulnerability
TIThreat hunter{BASE}/sn_ti_indicator_list.docom.snc.threat.intel
CTDCompliance engineer{BASE}/sn_vul_ctd_test_list.docom.snc.sn_vul_config_test
SecOps landing — where work queues liveWorkspaces + classic lists
VR Overview
Vulnerable Items
SIR Incidents
TI Indicators
CTD Tests
VR queueOpen P1/P2 VIs assigned to my group
SIR queueActive incidents · playbook tasks
SharedCMDB CI · Business service · Change
MetricsMTTR · SLA breach · aging CVE
Screen — analysts live in workspaces; implementers configure lists, rules, and flows behind these tiles.

§2 — Full VRO description cycle (scanner → close)

VR lifecycle — read this flow before any lab step

External scan finds a flaw → platform normalizes CVE → creates or updates master → creates vulnerable item on CI → assignment rule → owner remediates via change/task → rescan verifies → VI closed.

SCANScanner export / API pull
IMPORTImport set + transform
MASTERsn_vul_vulnerability
ITEMsn_vul_vulnerable_item + CI
ASSIGNsn_vul_assignment_rule
FIXChange / remediation task
CLOSEVerified absent on rescan
1Scanner job
→
2sn_vul_entry
→
3Transform
→
4Vuln master
→
5VI + cmdb_ci
→
6Assignment
→
7Flow / BR
→
8change_request
→
9Closed VI

2.1 Scanner → import

Production: IntegrationHub spoke (Qualys, Tenable, Rapid7, CrowdStrike VM, Microsoft Defender) schedules pull or receives push. PDI lab: CSV/XML import set mimics the same transform targets.

Import Set · VR vendor rowsys_import_set / transform
Staging
Transform map
Run transform
Error log
cve_idCVE-2024-1234
host_fqdnapp-prod-01.corp.local
severityCritical · CVSS 9.8
plugin_idVendor-specific ID
first_found2026-10-01
→ tablesvulnerability + vulnerable_item
Screen — one staging row becomes master CVE (deduped) plus one VI per affected CI after IRE/matching.

2.2 Vulnerability master (CVE catalog)

sn_vul_vulnerability holds one record per CVE (or vendor vuln ID): title, CVSS, published dates, exploit flags, solutions references. Many VIs point to one master.

Vulnerability · CVE mastersn_vul_vulnerability.do
Details
Related VIs
Third party
Solution
NumberVUL0012345
CVECVE-2024-1234
Base score9.8
ExploitKnown · sn_vul_third_party_entry
VI count47 open / 3 closed
Screen — prioritization formulas read master fields; do not duplicate CVE text on every VI.

2.3 Vulnerable item (asset × vulnerability)

sn_vul_vulnerable_item is the work unit: state, priority, risk score, assignment group, link to cmdb_ci, link to master vulnerability, remediation dates.

Vulnerable Item · work recordsn_vul_vulnerable_item.do
Form
CMDB CI
Remediation
History
StateOpen → In progress → Closed
Priority1 Critical (computed)
CILinux Server APP-PROD-01
Assigned toUnix Admins (rule)
ChangeCHG0098765 linked
SLA7 days (P1)
Screen — owners remediate at VI level; bulk remediation uses vulnerability groups or patch-ID rollups.

2.4 Assignment → remediation change → close

RULEsn_vul_assignment_rule
→
OWNGroup / user
→
TASKsn_vul_remediation_task
→
CHGchange_request
→
SCANRescan pass
→
VIClosed

Close criteria (lab): VI state Closed when scanner no longer reports finding on that CI or accepted risk with approval (deferral workflow). Never close master while open VIs exist unless retiring CVE record intentionally.

Common PDI mistake: Import succeeds but VI has empty cmdb_ci — fix IRE identification or manual CI match before testing assignment rules.

2.5 Supporting VR objects in the cycle

2.6 Cross-app touchpoints

VRCritical VI
→
SIRsn_si_incident
←
TIIoC match
→
CTDFail test
→
VRNew VI

Example: default credentials VI may auto-create SIR; TI indicator on C2 IP enriches SIR; CTD CIS failure creates configuration-related VI.

§3 — Related tables (purpose + CMDB / SIR / TI links)

TableRole in VROKey relationshipsList URL
sn_vul_vulnerability CVE / vuln master catalog; CVSS, title, global status 1:N → sn_vul_vulnerable_item; solutions; third-party intel {BASE}/sn_vul_vulnerability_list.do
sn_vul_vulnerable_item Per-asset finding; assignment, SLA, remediation state → sn_vul_vulnerability, → cmdb_ci, → change/task {BASE}/sn_vul_vulnerable_item_list.do
sn_vul_entry Intermediate import/normalized rows from scanners Feeds transform → master/VI {BASE}/sn_vul_entry_list.do
sn_vul_software Software/component implicated in findings Links entries/VIs to product versions {BASE}/sn_vul_software_list.do
sn_vul_third_party_entry External intel (exploit status, references) Matched on CVE; drives risk score {BASE}/sn_vul_third_party_entry_list.do
sn_vul_assignment_rule Auto-route VIs by CI class, tag, location, severity Sets group/user on insert/update {BASE}/sn_vul_assignment_rule_list.do
sn_vul_solution Remediation guidance (patch, config, workaround) Referenced from vulnerability/VI {BASE}/sn_vul_solution_list.do
sn_vul_remediation_task Work breakdown for fix (may precede change) Parent VI; assigned owner tasks {BASE}/sn_vul_remediation_task_list.do
sn_si_incident Security incident when exploit/active threat Related CIs overlap with VI cmdb_ci {BASE}/sn_si_incident_list.do
sn_ti_indicator IoC (IP, hash, domain) for hunt/enrichment SIR observables; optional VR context {BASE}/sn_ti_indicator_list.do
cmdb_ci (+ classes) Asset anchor for every VI; criticality drives priority IRE identification from scan host keys {BASE}/cmdb_ci_list.do
change_request Controlled remediation window Linked from VI / vulnerability group {BASE}/change_request_list.do
// PDI: prove VI → CI join (Scripts - Background)
var vi = new GlideRecord('sn_vul_vulnerable_item');
vi.addNotNullQuery('cmdb_ci');
vi.setLimit(5);
vi.query();
while (vi.next()) {
  gs.info(vi.number + ' → ' + vi.cmdb_ci.getDisplayValue() +
    ' | CVE ' + vi.vulnerability.cve_id);
}

§4 — Direct {BASE} URLs (major pages)

AreaNavigation (classic)Direct URL
VR WorkspaceAll → Vulnerability Response → Overview{BASE}/now/vulnerability/overview
SIR WorkspaceSecurity Incident Response workspace{BASE}/now/sir/workspace
Vulnerabilities (master)VR → Vulnerabilities{BASE}/sn_vul_vulnerability_list.do
Vulnerable ItemsVR → Vulnerable Items{BASE}/sn_vul_vulnerable_item_list.do
Assignment rulesVR → Administration → Assignment Rules{BASE}/sn_vul_assignment_rule_list.do
Remediation tasksVR → Remediation Tasks{BASE}/sn_vul_remediation_task_list.do
Security incidentsSecOps → Incidents{BASE}/sn_si_incident_list.do
TI indicatorsThreat Intelligence → Indicators{BASE}/sn_ti_indicator_list.do
CTD testsConfiguration Compliance{BASE}/sn_vul_ctd_test_list.do
CTD resultsCompliance results{BASE}/sn_vul_ctd_result_list.do
Guided Setup (SecOps)Guided Setup application{BASE}/now/guided-setup
Flow DesignerProcess Automation → Flow Designer{BASE}/now/flow-designer
Flows (list)Process Automation → Flows{BASE}/sys_hub_flow_list.do
Playbooks (SIR)Workflow Studio{BASE}/now/workflow-studio/home
IntegrationHub spokesIntegrationHub → Spokes{BASE}/sys_hub_spoke_list.do
ConnectionsIntegrationHub → Connections{BASE}/sys_hub_connection_list.do
Plugins (activate VR)System Definition → Plugins{BASE}/sys_plugins_list.do
CMDB CIsConfiguration → Computers / Servers{BASE}/cmdb_ci_server_list.do
IRE identifiersCMDB → Identification/Reconciliation{BASE}/cmdb_identifier_list.do
SecOps PA dashboardPerformance Analytics{BASE}/$pa_dashboard.do
Roles (SecOps)User Administration → Roles{BASE}/sys_user_role_list.do
Groups (owners)User Administration → Groups{BASE}/sys_user_group_list.do

§5 — PDI lab steps (SOC analyst + implementer)

Lab path — ~90 minutes on a fresh PDI

Activate plugins → seed CMDB → import sample finding → verify master/VI → assignment rule → Flow notification → remediation change → close VI.

Lab A — Enable SecOps stack

  1. Open VR + SIR + TI + CTD plugins; activate (PDI may take several minutes).
  2. Run Guided Setup SecOps/Vulnerability tiles until green checks (groups, properties, sample data if offered).
  3. Create groups: Vulnerability Managers, Unix Admins, Windows Admins via Groups; assign test users.
  4. Confirm roles: e.g. sn_vul.vulnerability_read, sn_vul.vulnerability_write (names vary by version — search role list).

Lab B — CMDB anchor (before scan data)

  1. Create or pick two servers in cmdb_ci_server; set name, ip_address, business_criticality.
  2. Note FQDN/IP — import transform will match on these keys.
  3. Optional: open IRE identifiers and trace which fields identify a Linux server.

Lab C — Simulate scanner import

  1. Locate VR import set table (often vendor-specific staging) via tables sn_vul% or use OOB sample import if Guided Setup loaded one.
  2. Load 2 rows: same CVE, two different hostnames matching your CIs.
  3. Run transform; open Vulnerabilities — expect one master.
  4. Open Vulnerable Items — expect two VIs with CI populated.
// Optional: adjust risk on a VI (Background script)
var vi = new GlideRecord('sn_vul_vulnerable_item');
vi.addQuery('state', 'open');
vi.setLimit(1);
vi.query();
if (vi.next()) {
  vi.setValue('priority', '1');
  vi.update();
  gs.info('Updated ' + vi.number);
}

Lab D — Assignment rule

  1. Open Assignment rules; New.
  2. Condition: CI class = Linux Server OR tag = production.
  3. Action: Assignment group = Unix Admins.
  4. Re-import or update VI; confirm group changed on form.

Lab E — Analyst workflow (workspace)

  1. Open VR workspace as vulnerability manager.
  2. Filter open P1; open one VI; review linked CVE master and solution.
  3. Create Change Request (category security); link from VI related lists.
  4. Move VI to In progress; set planned remediation date.

Lab F — Close loop

  1. Simulate rescan: update VI state to Closed with close code Fixed (or import absent row per OOB logic).
  2. Verify master still shows correct open VI count.
  3. Document SLA: compare opened vs closed timestamps on VI.

Lab G — Cross-app (optional 30 min)

  1. Create TI indicator on sn_ti_indicator; relate to SIR test incident.
  2. Run one CTD test from CTD tests; observe failing CI → VI pattern if configured.
  3. Open SIR workspace; confirm shared CI appears on both SIR and VI.
LabPass gateEvidence screenshot
A PluginsVR lists accessible without ACL errorPlugin active + workspace load
B CMDB2 CIs with criticality setCI form
C Import1 master, 2 VIs, CI linkedVI list + form
D AssignCorrect group auto-setAssignment rule + VI
E RemediateCHG linked, state in progressVI + change
F CloseVI closed, counts correctClosed VI audit

§6 — Best practice chips (VR / SecOps)

✓ Activate VR+CMDB before scanner spokes ✓ IRE match keys = scanner export fields ✓ One CVE master, many VIs ✓ Assignment rules before go-live import ✓ P1/P2 SLA defined per priority band ✓ Remediate via change for prod CIs ✓ Use VR workspace for owners, not raw lists ✓ Flow Designer for notify + auto-assign ✓ Separate SecOps groups from ITSM admin ✓ Test import on subset staging first ✓ Link VI to cmdb_ci always ✓ Deferral = risk approval workflow ✗ Close VI with open exploit on critical CI ✗ Duplicate CVE masters per scanner ✗ Global scope custom VR tables ✗ Manual assign 10k VIs ✗ Skip rescan verification ✗ Patch without change on prod ✗ Mix SIR playbooks into VR flows blindly ✗ Table API bulk load without transform ✗ Admin-only UAT (use owner persona) ✗ Rewrite OOB sn_vul transforms in global ✗ Ignore third-party exploit intel feed

§7 — Flow Designer automates VR

OOB VR ships flows and subflows for common patterns. Custom implementations typically add: auto-assign on VI insert, create change when priority=1, notify owner on assignment or SLA warning.

TRIGRecord created
→
IFpriority ≤ 2
→
ACTAssign group
→
ACTCreate Change
→
ACTSend notification
→
ACTUpdate VI state
Flow Designer · VR VI On Createsys_hub_flow · table sn_vul_vulnerable_item
Trigger
Condition
Actions
Subflows
TriggerCreated — sn_vul_vulnerable_item
Ifpriority is 1 or 2 AND cmdb_ci not empty
ActionUpdate Record — assignment_group from data pill
ActionCreate Record — change_request (template)
ActionSend Email — group manager + VI link
ActionUpdate Record — VI.state = in_progress
Screen — build in Flow Designer; activate only after Lab C proves data model.

7.1 Implementer click-path (PDI)

NEW FLOWTable trigger VI
CONDITIONPriority / CI class
ASSIGNUpdate VI fields
CHANGECreate linked CHG
NOTIFYEmail / Slack spoke
TESTFlow execution details
PUBLISHActivate + monitor
Flow name: VR - Critical VI - Assign and Change
Scope: Global (OOB VR) OR your scoped app for extensions only
Trigger: Record Created — sn_vul_vulnerable_item
Condition: priority IN 1,2
Actions:
  1) Lookup assignment_group (from CI.support_group or assignment rule output)
  2) Update Record (VI.assignment_group, VI.state = in_progress)
  3) Create Record change_request (short_description, cmdb_ci, category=security)
  4) Create Record task_ci (link CI to change if needed)
  5) Send Notification (template: include VI.number, CVE, CI name, {BASE} link)

Do: Keep OOB VR flows active; add **new** flows for customer-specific notify/ITSM integration. Use subflows for "create change" so SIR and VR can reuse.

Don't: Clone and edit vendor-owned global flows in production without update set discipline — prefer extension flows triggered on same table with order/conditions that complement OOB.

§8 — ServiceNow SDK: CAN vs CANNOT for VR/SecOps

See full toolchain: SDK_CURSOR_FULL_DOCUMENTATION.html · SDK Windows full cycle · Flow labs: PRACTICAL_FLOW_DESIGNER_FROM_SCRATCH.html · events: 06_NOTIFICATIONS_EVENTS_JOBS.html.

SDK CAN

  • Custom **scoped app** wrappers around VR APIs (Script Includes, REST)
  • Fluent Flow (where supported) for remediation automation in your scope
  • Record() metadata for **your** tables, properties, roles in scope
  • ATF tests that assert VI state transitions in PDI
  • Integration outbound from scoped app to ticketing/SOAR
  • Custom notifications referencing VI fields via mail scripts in scope

SDK CAN (config)

  • Export/update sets for scoped artifacts only
  • CI/CD pipeline for scoped application code
  • Scripted REST facade: accept scanner JSON → call OOB API
  • Custom dashboards/widgets reading sn_vul_vulnerable_item (read ACLs)
  • Wrapper SI: prioritize() pattern in scoped include calling GlideRecord

SDK CANNOT

  • Redefine or patch **OOB** sn_vul store apps/plugins via SDK
  • Replace **scanner IntegrationHub spoke** UI or closed vendor actions
  • Ship **Playbook Designer / Workflow Studio** graphs from SDK repo
  • Alter CMDB IRE OOB identifiers as scoped Fluent records (use instance config)
  • Clone VR workspace UX components as unsupported overrides
  • Grant cross-scope VR admin without platform governance
GoalRecommended approachAvoid
Auto-assign VIOOB assignment rules + optional scoped FlowGlobal BR duplicating OOB VR engine
Scanner ingestIH spoke + import/transform (OOB)Direct JDBC insert into sn_vul_* from SDK job
Priority scoreOOB calc + scoped SI extensionOverwrite master CVSS in global script
RemediationChange + task templates; Flow create recordScoped table replacing change_request
SIR correlationOOB related lists / playbooksSDK-only incident engine
// Scoped app pattern (conceptual — lives in YOUR scope, not sn_vul)
// tables.now.ts — custom integration log
// business-rules.now.ts — on insert x_scope_scan_event → call OOB Import API
// flows — trigger on x_scope_scan_event, not fork sn_vul_vulnerable_item OOB flows
// CANNOT: npm package that rewrites com.snc.vulnerability plugin tables

§9 — Related documentation

VR description cycle — single-page recap flow

QualysExport
→
IHSpoke
→
sn_vul_entryStage
→
TransformMap
→
sn_vul_vulnerabilityMaster
→
sn_vul_vulnerable_item+cmdb_ci
→
sn_vul_assignment_rule
→
FlowNotify
→
sn_vul_remediation_task
→
change_requestFix
→
RescanPass
→
VIClosed

SIR ↔ VR ↔ TI ↔ CTD — operator glance board

When to open which app

Active exploit on prod

VR VI + likely SIR incident; TI enrichment; emergency change.

Missing patch bulk

VR vulnerability group / patch rollup → one change many CIs.

CIS hardening drift

CTD fail → VI or config task; not always SIR unless policy breach incident.

Appendix — State vocabulary (typical VI)

PhaseVI state (conceptual)Owner action
TriageOpen / NewValidate CI, priority, false positive check
PlanIn progressSchedule change, assign remediation task
ExecuteIn progressImplement patch/config; link CHG
VerifyPending verificationRescan import confirms fix
DoneClosedDocument close code; master counts update
ExceptionDeferred / risk acceptedApproval + expiry date; monitor

Appendix — Priority ↔ SLA (OOB reference bands)

PriorityLabelTypical SLA target
1Critical7 days
2High30 days
3Medium90 days
4Low180 days
5InfoBest effort

Appendix — Scanner integration checklist

Appendix — CMDB fields that affect VR score

cmdb_ci fieldWhy VR cares
business_criticalityWeight in risk score / priority
support_groupDefault assignment when rule matches
locationRegional assignment rules
os / classRoute to Unix vs Windows admins
install_statusFilter retired CIs from open VIs
Service mappingBusiness impact via dependent services

Appendix — sn_si_incident vs VR

Create SIR when human response is required for active threat (malware, exfil, account compromise). VR handles exposure management (vuln present). Same CI may appear on both; use related records instead of duplicating work in ITSM incident unless policy requires.

SIR incident · linked contextsn_si_incident.do
Overview
Observables
Affected CIs
Playbook
CategoryMalware / Phishing / …
MITRETactics & techniques tagged
CISame cmdb_ci as open VI
TIIndicators linked from sn_ti_indicator
VRRelated VI for patch gap after contain
Screen — after containment, VR remediation closes underlying exposure.

Appendix — Third-party intel (sn_vul_third_party_entry)

Feeds update exploit availability on CVE masters. Implementers schedule intel pull (NVD, vendor APIs). Analysts use exploit flag to escalate priority without manual CVE research.

Appendix — Vulnerability groups (bulk remediation)

Group VIs by host, application, or patch ID to open one change for many items. Search lists/filters on VI for shared vulnerability.patch_id or business service. Pattern documented in SECOPS.html §4.5.

// Bulk change pattern (background — adapt thresholds)
var agg = new GlideAggregate('sn_vul_vulnerable_item');
agg.addQuery('state', 'open');
agg.addQuery('priority', 'IN', '1,2');
agg.addAggregate('COUNT');
agg.groupBy('vulnerability.patch_id');
agg.query();
while (agg.next()) {
  var patchId = agg.getValue('vulnerability.patch_id');
  var count = parseInt(agg.getAggregate('COUNT'), 10);
  if (patchId && count >= 5) {
    gs.info('Consider bulk CHG for patch ' + patchId + ' (' + count + ' VIs)');
  }
}

Appendix — Roles smoke test (impersonation)

  1. Impersonate vulnerability manager → workspace + edit VI.
  2. Impersonate CI owner → see only assigned VIs (ACL check).
  3. Impersonate unauthorized user → expect read denial on admin lists.
modules/SECOPS.html SDK_CURSOR_FULL_DOCUMENTATION.html {BASE}/now/vulnerability/overview {BASE}/now/flow-designer
Next depth: For certification-style labs and 30-question drills, continue in SECOPS §19. For HR Leave scoped SDK examples, use scoped tables only — do not merge with OOB sn_vul store apps.