Skip to content

Commit bd69960

Browse files
Merge branch 'master' into blackout/SYN-7128/layer-perms-part2
2 parents 1b587b2 + 5f42645 commit bd69960

File tree

3 files changed

+90
-5
lines changed

3 files changed

+90
-5
lines changed

synapse/lib/stormlib/cell.py

+42-4
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,16 @@
22
import logging
33

44
import synapse.exc as s_exc
5-
import synapse.lib.const as s_const
5+
import synapse.lib.autodoc as s_autodoc
66
import synapse.lib.stormtypes as s_stormtypes
77

88
logger = logging.getLogger(__name__)
99

10+
def prepHotfixDesc(txt):
11+
lines = txt.split('\n')
12+
lines = s_autodoc.scrubLines(lines)
13+
lines = s_autodoc.ljuster(lines)
14+
return lines
1015

1116
storm_missing_autoadds = '''
1217
$absoluteOrder = $lib.view.list(deporder=$lib.true)
@@ -64,6 +69,17 @@
6469
}
6570
'''
6671

72+
storm_migrate_riskhasvuln = '''
73+
for $view in $lib.view.list(deporder=$lib.true) {
74+
view.exec $view.iden {
75+
$layer = $lib.layer.get()
76+
for ($buid, $sode) in $layer.getStorNodesByForm(risk:hasvuln) {
77+
yield $buid
78+
$lib.model.migration.s.riskHasVulnToVulnerable($node)
79+
}
80+
}
81+
}
82+
'''
6783

6884
hotfixes = (
6985
((1, 0, 0), {
@@ -78,6 +94,20 @@
7894
'desc': 'Populate it:sec:cpe:v2_2 properties from existing CPE where the property is not set.',
7995
'query': storm_missing_cpe22,
8096
}),
97+
((4, 0, 0), {
98+
'desc': '''
99+
Create risk:vulnerable nodes from existing risk:hasvuln nodes.
100+
101+
This hotfix should only be applied after all logic that would create
102+
risk:hasvuln nodes has been updated. The hotfix uses the
103+
$lib.model.migration.s.riskHasVulnToVulnerable() function,
104+
which can be used directly for testing.
105+
106+
Tags, tag properties, edges, and node data will all be copied
107+
to the risk:vulnerable nodes.
108+
''',
109+
'query': storm_migrate_riskhasvuln,
110+
}),
81111
)
82112
runtime_fixes_key = 'cortex:runtime:stormfixes'
83113

@@ -174,7 +204,9 @@ async def _hotFixesApply(self):
174204
assert desc is not None
175205
assert vars is not None
176206

177-
await self.runt.printf(f'Applying hotfix {vers} for [{desc}]')
207+
title = prepHotfixDesc(desc)[0]
208+
await self.runt.printf(f'Applying hotfix {vers} for [{title}]')
209+
178210
try:
179211
query = await self.runt.getStormQuery(text)
180212
async with self.runt.getSubRuntime(query, opts={'vars': vars}) as runt:
@@ -206,8 +238,14 @@ async def _hotFixesCheck(self):
206238
continue
207239

208240
dowork = True
209-
desc = info.get('desc')
210-
await self.runt.printf(f'Would apply fix {vers} for [{desc}]')
241+
242+
desclines = prepHotfixDesc(info.get('desc'))
243+
await self.runt.printf(f'Would apply fix {vers} for [{desclines[0]}]')
244+
if len(desclines) > 1:
245+
for line in desclines[1:]:
246+
await self.runt.printf(f' {line}' if line else '')
247+
else:
248+
await self.runt.printf('')
211249

212250
return dowork
213251

synapse/lib/stormlib/model.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1090,7 +1090,7 @@ async def _riskHasVulnToVulnerable(self, n, nodata=False):
10901090
self.runt.confirmPropSet(riskvuln.props['vuln'])
10911091
self.runt.confirmPropSet(riskvuln.props['node'])
10921092

1093-
if (seen := n.get('.seen')):
1093+
if seen := n.get('.seen'):
10941094
self.runt.confirmPropSet(riskvuln.props['.seen'])
10951095
props['.seen'] = seen
10961096

synapse/tests/test_lib_stormlib_cell.py

+47
Original file line numberDiff line numberDiff line change
@@ -312,3 +312,50 @@ async def test_stormfix_cpe2_2(self):
312312
self.len(1, await core.nodes('it:sec:cpe:v2_2', opts={'view': view0}))
313313
self.len(2, await core.nodes('it:sec:cpe:v2_2', opts={'view': view1}))
314314
self.len(1, await core.nodes('it:sec:cpe:v2_2', opts={'view': view2}))
315+
316+
async def test_stormfix_riskhasvuln(self):
317+
318+
async with self.getTestCore() as core:
319+
320+
view0 = core.getView().iden
321+
view1 = await core.callStorm('return($lib.view.get().fork().iden)')
322+
view2 = await core.callStorm('return($lib.view.add(($lib.layer.add().iden,)).iden)')
323+
324+
self.len(1, await core.nodes('''
325+
[ risk:hasvuln=*
326+
:vuln={[ risk:vuln=* ]}
327+
:software={[ it:prod:softver=* :name=view0 ]}
328+
]
329+
''', opts={'view': view0}))
330+
331+
self.len(1, await core.nodes('''
332+
risk:hasvuln
333+
[ :software={[ it:prod:softver=* :name=view1 ]} ]
334+
''', opts={'view': view1}))
335+
336+
self.len(1, await core.nodes('''
337+
[ risk:hasvuln=*
338+
:vuln={[ risk:vuln=* ]}
339+
:host={[ it:host=* :name=view2 ]}
340+
]
341+
''', opts={'view': view2}))
342+
343+
opts = {'vars': {'key': s_stormlib_cell.runtime_fixes_key, 'valu': (2, 0, 0)}}
344+
await core.callStorm('$lib.globals.set($key, $valu)', opts)
345+
346+
msgs = await core.stormlist('$lib.cell.hotFixesCheck()')
347+
printmesgs = [m[1]['mesg'] for m in msgs if m[0] == 'print']
348+
self.isin('Would apply fix (3, 0, 0)', printmesgs[0])
349+
self.eq('', printmesgs[1])
350+
self.isin('Would apply fix (4, 0, 0)', printmesgs[2])
351+
self.eq('', printmesgs[3])
352+
self.isin('This hotfix should', printmesgs[4])
353+
self.eq('', printmesgs[-1])
354+
355+
msgs = await core.stormlist('$lib.cell.hotFixesApply()')
356+
self.stormIsInPrint('Applying hotfix (4, 0, 0) for [Create risk:vulnerable nodes', msgs)
357+
self.stormIsInPrint('Applied hotfix (4, 0, 0)', msgs)
358+
359+
self.len(1, await core.nodes('risk:vulnerable -> it:prod:softver +:name=view0', opts={'view': view0}))
360+
self.len(1, await core.nodes('risk:vulnerable -> it:prod:softver +:name=view1', opts={'view': view1}))
361+
self.len(1, await core.nodes('risk:vulnerable -> it:host', opts={'view': view2}))

0 commit comments

Comments
 (0)