Skip to content

Commit 9775655

Browse files
committed
Make sensitivity of is_vulnerable_to_client_renegotiation_dos configurable
1 parent 761892b commit 9775655

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

sslyze/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
# Classes for setting up scan commands and extra arguments
2323
from sslyze.plugins.scan_commands import ScanCommand
2424
from sslyze.plugins.certificate_info.implementation import CertificateInfoExtraArgument
25+
from sslyze.plugins.session_renegotiation_plugin import SessionRenegotiationExtraArgument
2526

2627
# Classes for scanning the servers
2728
from sslyze.scanner.models import (

sslyze/plugins/session_renegotiation_plugin.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,19 @@
2121
from sslyze.server_connectivity import ServerConnectivityInfo, TlsVersionEnum
2222

2323

24+
@dataclass(frozen=True)
25+
class SessionRenegotiationExtraArgument(ScanCommandExtraArgument):
26+
"""Additional configuration for testing a server for client-initiated renegotiation.
27+
28+
Attributes:
29+
client_renegotiation_attempts: The number of attempts to make when testing the client initiated
30+
renegotiation DoS vector. If the server accepts this many attempts,
31+
is_vulnerable_to_client_renegotiation_dos is set. Default: 10.
32+
"""
33+
34+
client_renegotiation_attempts: int
35+
36+
2437
@dataclass(frozen=True)
2538
class SessionRenegotiationScanResult(ScanCommandResult):
2639
"""The result of testing a server for insecure TLS renegotiation and client-initiated renegotiation.
@@ -82,14 +95,13 @@ class SessionRenegotiationImplementation(ScanCommandImplementation[SessionRenego
8295

8396
@classmethod
8497
def scan_jobs_for_scan_command(
85-
cls, server_info: ServerConnectivityInfo, extra_arguments: Optional[ScanCommandExtraArgument] = None
98+
cls, server_info: ServerConnectivityInfo, extra_arguments: Optional[SessionRenegotiationExtraArgument] = None
8699
) -> List[ScanJob]:
87-
if extra_arguments:
88-
raise ScanCommandWrongUsageError("This plugin does not take extra arguments")
100+
client_renegotiation_attempts = extra_arguments.client_renegotiation_attempts if extra_arguments else 10
89101

90102
return [
91103
ScanJob(function_to_call=_test_secure_renegotiation, function_arguments=[server_info]),
92-
ScanJob(function_to_call=_test_client_renegotiation, function_arguments=[server_info]),
104+
ScanJob(function_to_call=_test_client_renegotiation, function_arguments=[server_info, client_renegotiation_attempts]),
93105
]
94106

95107
@classmethod
@@ -147,7 +159,7 @@ def _test_secure_renegotiation(server_info: ServerConnectivityInfo) -> Tuple[_Sc
147159
return _ScanJobResultEnum.SUPPORTS_SECURE_RENEG, supports_secure_renegotiation
148160

149161

150-
def _test_client_renegotiation(server_info: ServerConnectivityInfo) -> Tuple[_ScanJobResultEnum, bool]:
162+
def _test_client_renegotiation(server_info: ServerConnectivityInfo, client_renegotiation_attempts: int) -> Tuple[_ScanJobResultEnum, bool]:
151163
"""Check whether the server honors session renegotiation requests."""
152164
# Try with TLS 1.2 even if the server supports TLS 1.3 or higher as there is no reneg with TLS 1.3
153165
if server_info.tls_probing_result.highest_tls_version_supported.value >= TlsVersionEnum.TLS_1_3.value:
@@ -180,7 +192,7 @@ def _test_client_renegotiation(server_info: ServerConnectivityInfo) -> Tuple[_Sc
180192
try:
181193
# Do a reneg multiple times in a row to be 100% sure that the server has no mitigations in place
182194
# https://github.com/nabla-c0d3/sslyze/issues/473
183-
for i in range(10):
195+
for i in range(client_renegotiation_attempts):
184196
ssl_connection.ssl_client.do_renegotiate()
185197
accepts_client_renegotiation = True
186198

sslyze/scanner/models.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
from sslyze.plugins.openssl_cipher_suites.implementation import CipherSuitesScanResult
1919
from sslyze.plugins.robot.implementation import RobotScanResult
2020
from sslyze.plugins.scan_commands import ScanCommand, ScanCommandsRepository
21-
from sslyze.plugins.session_renegotiation_plugin import SessionRenegotiationScanResult
21+
from sslyze.plugins.session_renegotiation_plugin import SessionRenegotiationScanResult, \
22+
SessionRenegotiationExtraArgument
2223
from sslyze.plugins.session_resumption.implementation import (
2324
SessionResumptionSupportScanResult,
2425
SessionResumptionSupportExtraArgument,
@@ -33,6 +34,7 @@ class ScanCommandsExtraArguments:
3334
# Field is present if extra arguments were provided for the corresponding scan command
3435
certificate_info: Optional[CertificateInfoExtraArgument] = None
3536
session_resumption: Optional[SessionResumptionSupportExtraArgument] = None
37+
session_renegotiation: Optional[SessionRenegotiationExtraArgument] = None
3638

3739

3840
@dataclass(frozen=True)

0 commit comments

Comments
 (0)