Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions pymisp/tools/attributevalidationtool.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@
DOMAIN_RE = re.compile(r'^[A-Z0-9.\-_]+\.[A-Z0-9\-]{2,}$', flags=re.IGNORECASE)
HEX_RE = re.compile(r'^[0-9a-fA-F]+$')
MAC_ADDRESS_RE = re.compile(r'^([a-f0-9]{2}:){5}[a-f0-9]{2}$')
MAC_EUI_64_RE = re.compile(r'^([a-f0-9]{2}:){3}ff:fe:(:[a-f0-9]{2}){3}$')
MAC_EUI_64_RE = re.compile(r'^([a-f0-9]{2}:){3}ff:fe(:[a-f0-9]{2}){3}$')
ONION_RE = re.compile(r'^([a-z2-7]{16}|[a-z2-7]{56})\.onion$')
REMOVE_NON_ALPHANUM_CAP_RE = re.compile(r'[^0-9A-Z]+')
REMOVE_NON_ALPHANUM_RE = re.compile(r'[^0-9A-Fa-f]')
Expand Down Expand Up @@ -219,7 +219,7 @@ def modifyBeforeValidation(cls, attribute_type, value):
return value
case 'mac-address' | 'mac-eui-64':
value = re.sub(REMOVE_NON_ALPHANUM_RE, '', value).lower()
return ':'.join(value[i:i+2] for i in range(0, 12, 2))
return ':'.join(value[i:i+2] for i in range(0, len(value), 2))
case 'hostname|port':
return value.replace(':', '|').lower()
case 'boolean':
Expand Down Expand Up @@ -589,8 +589,11 @@ def _is_ssdeep(value):
@classmethod
def _is_ssh_fingerprint(cls, value):
if value.startswith('SHA256:'):
# MISP ignores whitespace in the base64 encoded fingerprint
fingerprint = ''.join(value[7:].split())
try:
decoded = b64decode(value[7:])
# OpenSSH prints SHA256 fingerprints without the base64 padding
decoded = b64decode(fingerprint + '=' * (-len(fingerprint) % 4), validate=True)
except Exception:
return False
return decoded is not None and len(decoded) == 32
Expand Down
17 changes: 13 additions & 4 deletions tests/test_attributevalidationtool.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class TestAttributeValidationTool(unittest.TestCase):

def _should_be_valid(self, type_, *values):
for value in values:
self.assertTrue(AttributeValidationTool.validate(type_, value))
self.assertIs(AttributeValidationTool.validate(type_, value), True)

def _should_be_invalid(self, type_, *values):
for value in values:
Expand Down Expand Up @@ -75,6 +75,8 @@ def test_modify_before_validation_hashes(self):
def test_modify_before_validation_mac(self):
self.assertEqual('aa:bb:cc:dd:ee:ff', AttributeValidationTool.modifyBeforeValidation('mac-address', 'AA-BB-CC-DD-EE-FF'))
self.assertEqual('aa:bb:cc:dd:ee:ff', AttributeValidationTool.modifyBeforeValidation('mac-address', 'aabbccddeeff'))
self.assertEqual('aa:bb:cc:dd:ee:ff:00:11', AttributeValidationTool.modifyBeforeValidation('mac-address', 'AA-BB-CC-DD-EE-FF-00-11'))
self.assertEqual('aa:bb:cc:ff:fe:dd:ee:11', AttributeValidationTool.modifyBeforeValidation('mac-eui-64', 'AA-BB-CC-FF-FE-DD-EE-11'))

def test_modify_before_validation_phone(self):
self.assertEqual('+123456', AttributeValidationTool.modifyBeforeValidation('phone-number', '00123456'))
Expand All @@ -99,8 +101,8 @@ def test_modify_before_validation_x509(self):
self.assertEqual('aa6fc83f37787abea6be2c5126163fd3', AttributeValidationTool.modifyBeforeValidation('x509-fingerprint-md5', 'AA:6F:C8:3F:37:78:7A:BE:A6:BE:2C:51:26:16:3F:D3'))

def test_validate_as(self):
self._should_be_valid('AS', '0', 0, 1, '1', 4294967295, '1.1')
self._should_be_invalid('AS', '1.2.3.4')
self._should_be_valid('AS', '0', 0, 1, '1', 4294967295)
self._should_be_invalid('AS', '1.1', '1.2.3.4')

def test_validate_domain_ip(self):
self._should_be_valid(
Expand Down Expand Up @@ -217,7 +219,7 @@ def test_validate_networking(self):
self._should_be_valid('ip-dst|port', '127.0.0.1|80', '::1|80')
self._should_be_invalid('ip-dst|port', '127.0.0.1', '127.0.0.1|99999')

self._should_be_valid('onion-address', 'abcdefghijklmnop.onion', 'abcdefghijklmnopqrstuvwxyz234567abcdefghijklmnopqrstuvwxyz23.onion')
self._should_be_valid('onion-address', 'abcdefghijklmnop.onion', 'abcdefghijklmnopqrstuvwxyz234567abcdefghijklmnopqrstuvwx.onion')
self._should_be_invalid('onion-address', 'invalid.onion', 'abc.onion')

self._should_be_valid('mac-address', 'aa:bb:cc:dd:ee:ff')
Expand Down Expand Up @@ -252,6 +254,13 @@ def test_validate_ssh_fingerprint(self):
'7b:e5:6f:a7:f4:f9:81:62:5c:e3:1f:bf:8b:57:6c:5a',
'MD5:7b:e5:6f:a7:f4:f9:81:62:5c:e3:1f:bf:8b:57:6c:5a',
'SHA256:mVPwvezndPv/ARoIadVY98vAC0g+P/5633yTC4d/wXE',
'SHA256:mVPwvezndPv/ARoIadVY98vAC0g+P/5633yTC4d/wXE=',
'SHA256:mVPwvezndPv/ARoIadVY98vAC0g+P/5633 yTC4d/wXE',
)
self._should_be_invalid(
'ssh-fingerprint',
'SHA256:mVPwvezndPv/ARoIadVY98vAC0g+P/5633yTC4d/wX',
'SHA256:mVPwvezndPv/ARoIadVY98vAC0g+P/5633yTC4d/wX!',
)

def test_validate_event(self):
Expand Down
Loading