Skip to content

Commit ae4ae2d

Browse files
committed
better error handling, unauthenticated scan with malformed credentials
1 parent 713b3ea commit ae4ae2d

File tree

3 files changed

+37
-19
lines changed

3 files changed

+37
-19
lines changed

ospd_openvas/daemon.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1266,7 +1266,7 @@ def exec_scan(self, scan_id: str):
12661266
if not scan_prefs.prepare_credentials_for_openvas():
12671267
error = (
12681268
'All authentifications contain errors.'
1269-
+ 'Scan will get interrupted.'
1269+
+ 'Starting unauthenticated scan instead.'
12701270
)
12711271
self.add_scan_error(
12721272
scan_id,
@@ -1275,8 +1275,8 @@ def exec_scan(self, scan_id: str):
12751275
value=error,
12761276
)
12771277
logger.error(error)
1278-
do_not_launch = True
1279-
for e in scan_prefs.errors:
1278+
errors = scan_prefs.get_error_messages()
1279+
for e in errors:
12801280
error = 'Malformed credential. ' + e
12811281
self.add_scan_error(
12821282
scan_id,

ospd_openvas/preferencehandler.py

+15-5
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,12 @@ def prepare_scan_id_for_openvas(self):
115115
"""
116116
self.kbdb.add_scan_id(self.scan_id)
117117

118+
def get_error_messages(self) -> List:
119+
"""Returns the Error List and reset it"""
120+
ret = self.errors
121+
self.errors = []
122+
return ret
123+
118124
@property
119125
def target_options(self) -> Dict:
120126
"""Return target options from Scan collection"""
@@ -599,18 +605,22 @@ def build_credentials_as_prefs(self, credentials: Dict) -> List[str]:
599605
# Check service ssh
600606
if service == 'ssh':
601607
# For ssh check the Port
602-
port = cred_params.get('port', '')
608+
port = cred_params.get('port', '22')
603609
if not port:
604-
self.errors.append("Port for SSH is missing.")
605-
continue
610+
port = '22'
611+
warning = (
612+
"Missing port number for ssh credentials."
613+
+ " Using default port 22."
614+
)
615+
logger.warning(warning)
606616
elif not port.isnumeric():
607617
self.errors.append(
608618
"Port for SSH '" + port + "' is not a valid number."
609619
)
610620
continue
611-
elif int(port) > 65535:
621+
elif int(port) > 65535 or int(port) < 1:
612622
self.errors.append(
613-
"Port for SSH is out of range (0-65535): " + port
623+
"Port for SSH is out of range (1-65535): " + port
614624
)
615625
continue
616626
# For ssh check the credential type

tests/test_preferencehandler.py

+19-11
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,10 @@ def test_set_bad_service_credentials(self, mock_kb):
364364
p.scan_id = '456-789'
365365
p.kbdb.add_scan_preferences = MagicMock()
366366
r = p.prepare_credentials_for_openvas()
367+
e = p.get_error_messages()
367368

368369
self.assertFalse(r)
369-
self.assertIn("Unknown service type for credential: shh", p.errors)
370+
self.assertIn("Unknown service type for credential: shh", e)
370371

371372
@patch('ospd_openvas.db.KbDB')
372373
def test_set_bad_ssh_port_credentials(self, mock_kb):
@@ -387,9 +388,10 @@ def test_set_bad_ssh_port_credentials(self, mock_kb):
387388
p.scan_id = '456-789'
388389
p.kbdb.add_scan_preferences = MagicMock()
389390
r = p.prepare_credentials_for_openvas()
391+
e = p.get_error_messages()
390392

391393
self.assertFalse(r)
392-
self.assertIn("Port for SSH 'ab' is not a valid number.", p.errors)
394+
self.assertIn("Port for SSH 'ab' is not a valid number.", e)
393395

394396
@patch('ospd_openvas.db.KbDB')
395397
def test_missing_ssh_port_credentials(self, mock_kb):
@@ -410,8 +412,7 @@ def test_missing_ssh_port_credentials(self, mock_kb):
410412
p.kbdb.add_scan_preferences = MagicMock()
411413
r = p.prepare_credentials_for_openvas()
412414

413-
self.assertFalse(r)
414-
self.assertIn("Port for SSH is missing.", p.errors)
415+
self.assertTrue(r)
415416

416417
@patch('ospd_openvas.db.KbDB')
417418
def test_ssh_port_out_of_range_credentials(self, mock_kb):
@@ -432,9 +433,10 @@ def test_ssh_port_out_of_range_credentials(self, mock_kb):
432433
p.scan_id = '456-789'
433434
p.kbdb.add_scan_preferences = MagicMock()
434435
r = p.prepare_credentials_for_openvas()
436+
e = p.get_error_messages()
435437

436438
self.assertFalse(r)
437-
self.assertIn("Port for SSH is out of range (0-65535): 65536", p.errors)
439+
self.assertIn("Port for SSH is out of range (1-65535): 65536", e)
438440

439441
@patch('ospd_openvas.db.KbDB')
440442
def test_bad_type_for_ssh_credentials(self, mock_kb):
@@ -455,14 +457,15 @@ def test_bad_type_for_ssh_credentials(self, mock_kb):
455457
p.scan_id = '456-789'
456458
p.kbdb.add_scan_preferences = MagicMock()
457459
r = p.prepare_credentials_for_openvas()
460+
e = p.get_error_messages()
458461

459462
self.assertFalse(r)
460463
self.assertIn(
461464
"Unknown Credential Type for SSH: "
462465
+ "ups"
463466
+ ". Use 'up' for Username + Password"
464467
+ " or 'usk' for Username + SSH Key.",
465-
p.errors,
468+
e,
466469
)
467470

468471
@patch('ospd_openvas.db.KbDB')
@@ -483,13 +486,14 @@ def test_missing_type_for_ssh_credentials(self, mock_kb):
483486
p.scan_id = '456-789'
484487
p.kbdb.add_scan_preferences = MagicMock()
485488
r = p.prepare_credentials_for_openvas()
489+
e = p.get_error_messages()
486490

487491
self.assertFalse(r)
488492
self.assertIn(
489493
"Missing Credential Type for SSH."
490494
+ " Use 'up' for Username + Password"
491495
+ " or 'usk' for Username + SSH Key.",
492-
p.errors,
496+
e,
493497
)
494498

495499
@patch('ospd_openvas.db.KbDB')
@@ -513,12 +517,13 @@ def test_snmp_no_priv_alg_but_pw_credentials(self, mock_kb):
513517
p.scan_id = '456-789'
514518
p.kbdb.add_scan_preferences = MagicMock()
515519
r = p.prepare_credentials_for_openvas()
520+
e = p.get_error_messages()
516521

517522
self.assertFalse(r)
518523
self.assertIn(
519524
"When no privacy algorithm is used, the privacy"
520525
+ " password also has to be empty.",
521-
p.errors,
526+
e,
522527
)
523528

524529
@patch('ospd_openvas.db.KbDB')
@@ -543,13 +548,14 @@ def test_snmp_unknown_priv_alg_credentials(self, mock_kb):
543548
p.scan_id = '456-789'
544549
p.kbdb.add_scan_preferences = MagicMock()
545550
r = p.prepare_credentials_for_openvas()
551+
e = p.get_error_messages()
546552

547553
self.assertFalse(r)
548554
self.assertIn(
549555
"Unknows privacy algorithm used: "
550556
+ "das"
551557
+ ". Use 'aes', 'des' or '' (none).",
552-
p.errors,
558+
e,
553559
)
554560

555561
@patch('ospd_openvas.db.KbDB')
@@ -571,12 +577,13 @@ def test_snmp_missing_auth_alg_credentials(self, mock_kb):
571577
p.scan_id = '456-789'
572578
p.kbdb.add_scan_preferences = MagicMock()
573579
r = p.prepare_credentials_for_openvas()
580+
e = p.get_error_messages()
574581

575582
self.assertFalse(r)
576583
self.assertIn(
577584
"Missing authentification algorithm for SNMP."
578585
+ " Use 'md5' or 'sha1'.",
579-
p.errors,
586+
e,
580587
)
581588

582589
@patch('ospd_openvas.db.KbDB')
@@ -599,13 +606,14 @@ def test_snmp_unknown_auth_alg_credentials(self, mock_kb):
599606
p.scan_id = '456-789'
600607
p.kbdb.add_scan_preferences = MagicMock()
601608
r = p.prepare_credentials_for_openvas()
609+
e = p.get_error_messages()
602610

603611
self.assertFalse(r)
604612
self.assertIn(
605613
"Unknown authentification algorithm: "
606614
+ "sha2"
607615
+ ". Use 'md5' or 'sha1'.",
608-
p.errors,
616+
e,
609617
)
610618

611619
@patch('ospd_openvas.db.KbDB')

0 commit comments

Comments
 (0)