Files
safetynet/apps/inspector/test_security.py
T

68 lines
4.5 KiB
Python
Raw Normal View History

2026-10-13 10:33:31 +02:00
import unittest
from unittest.mock import patch
import io
from engine import scan_download, reference_document, inspect_content
def policy(source='rule malicious { strings: $a = "MALWARE_TEST_PAYLOAD" condition: $a }'):
return {'security':{'yara':{'enabled':True,'rules':[{'id':'central-malware','source':source}], 'maxScanBytes':1048576}},
'dlp':{'maxBytes':1048576,'rules':[],'semantic':{'enabled':False}}}
class SecurityTests(unittest.TestCase):
def test_real_yara_match(self):
import yara
result=scan_download(b'MZ\x00MALWARE_TEST_PAYLOAD',policy())
self.assertEqual(result['decision'],'block')
self.assertEqual(result['ruleId'],'central-malware')
self.assertTrue(result['coverage']['complete'])
def test_binary_malware_coverage_separate_from_dlp(self):
data=b'MZ\x00\xffbenign'
self.assertEqual(scan_download(data,policy())['decision'],'allow')
self.assertEqual(inspect_content(data,policy())['decision'],'block')
def test_invalid_or_empty_rules_fail_closed(self):
self.assertEqual(scan_download(b'safe',policy('invalid'))['decision'],'block')
p=policy();p['security']['yara']['rules']=[]
self.assertEqual(scan_download(b'safe',p)['decision'],'block')
self.assertEqual(scan_download(b'safe',{})['decision'],'block')
def test_include_and_console_import_rejected(self):
self.assertEqual(scan_download(b'safe',policy('include "C:/secret"'))['decision'],'block')
self.assertEqual(scan_download(b'safe',policy('import "console" rule leak { condition: console.log("secret") }'))['decision'],'block')
def test_size_failure(self):
p=policy();p['security']['yara']['maxScanBytes']=2
self.assertEqual(scan_download(b'large',p)['ruleId'],'yara-size-limit')
def test_reference_registration_contains_no_plaintext(self):
text=b'Internal confidential roadmap for new product launch during next quarter'
result=reference_document(text)
self.assertTrue(result['registrationReady']);self.assertTrue(result['fragmentHashes'])
self.assertNotIn('confidential',str(result))
self.assertFalse(reference_document(b'\xff\x00')['registrationReady'])
def test_training_truncation_never_claims_complete(self):
result=reference_document(' '.join('distinctword'+str(index) for index in range(1200)).encode())
self.assertEqual(len(result['fragmentHashes']),1000)
self.assertGreater(result['coverage']['fragmentHashesTotal'],1000)
self.assertTrue(result['coverage']['fragmentHashesTruncated'])
self.assertTrue(result['coverage']['extractionComplete'])
self.assertFalse(result['coverage']['complete'])
self.assertFalse(result['registrationReady'])
def test_text_training_does_not_create_temporary_content_files(self):
with patch('engine.tempfile.TemporaryDirectory',side_effect=AssertionError('Raw content persistence forbidden')):
result=reference_document(b'Confidential strategic roadmap contains enough words for fingerprint training')
self.assertTrue(result['registrationReady'])
def test_trained_fragments_block_reformatted_excerpt(self):
text=b'Internal confidential roadmap for new product launch during next quarter'
reference=reference_document(text)
p=policy();p['dlp']['rules']=[{'id':'trained','kind':'fragment-sha256','value':value} for value in reference['fragmentHashes']]
result=inspect_content(b'Introduction. INTERNAL confidential roadmap for new product launch during next quarter. Ending.',p)
self.assertEqual(result['ruleId'],'trained')
def test_real_bundled_ocr_offline_detects_image_secret(self):
from PIL import Image, ImageDraw, ImageFont
image=Image.new('RGB',(1000,180),'white')
ImageDraw.Draw(image).text((30,45),'Secret Roadmap',font=ImageFont.truetype('C:/Windows/Fonts/arial.ttf',60),fill='black')
output=io.BytesIO();image.save(output,format='PNG')
p=policy();p['dlp']['rules']=[{'id':'image-secret','kind':'literal','value':'Secret Roadmap'}]
# Inference and lazy initialization must not enter a model-download path.
with patch('rapidocr.utils.download_file.DownloadFile.run',side_effect=AssertionError('Network model download forbidden')):
result=inspect_content(output.getvalue(),p)
self.assertEqual(result['ruleId'],'image-secret')
self.assertTrue(result['coverage']['complete'])
if __name__=='__main__':unittest.main()