Skip to content

Commit fca777b

Browse files
committed
Add tracking of session renegotiation successs count and test
1 parent f262aa8 commit fca777b

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

sslyze/plugins/session_renegotiation_plugin.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,26 @@ class SessionRenegotiationScanResult(ScanCommandResult):
4040
Attributes:
4141
accepts_client_renegotiation: True if the server honors client-initiated renegotiation attempts.
4242
supports_secure_renegotiation: True if the server supports secure renegotiation.
43+
client_renegotiations_success_count: the number of successful client-initiated renegotiation attempts.
4344
"""
4445

4546
supports_secure_renegotiation: bool
4647
is_vulnerable_to_client_renegotiation_dos: bool
48+
client_renegotiations_success_count: int
4749

4850

4951
class SessionRenegotiationScanResultAsJson(BaseModelWithOrmModeAndForbid):
5052
supports_secure_renegotiation: bool
5153
is_vulnerable_to_client_renegotiation_dos: bool
54+
client_renegotiations_success_count: int
5255

5356

5457
class SessionRenegotiationScanAttemptAsJson(ScanCommandAttemptAsJson):
5558
result: Optional[SessionRenegotiationScanResultAsJson]
5659

5760

5861
class _ScanJobResultEnum(Enum):
59-
IS_VULNERABLE_TO_CLIENT_RENEG_DOS = 1
62+
CLIENT_RENEG_RESULT = 1
6063
SUPPORTS_SECURE_RENEG = 2
6164

6265

@@ -87,7 +90,9 @@ def result_to_console_output(cls, result: SessionRenegotiationScanResult) -> Lis
8790
return result_txt
8891

8992

90-
class SessionRenegotiationImplementation(ScanCommandImplementation[SessionRenegotiationScanResult, None]):
93+
class SessionRenegotiationImplementation(
94+
ScanCommandImplementation[SessionRenegotiationScanResult, SessionRenegotiationExtraArgument]
95+
):
9196
"""Test a server for insecure TLS renegotiation and client-initiated renegotiation."""
9297

9398
cli_connector_cls = _SessionRenegotiationCliConnector
@@ -118,11 +123,13 @@ def result_for_completed_scan_jobs(
118123
result_enum, value = job.get_result()
119124
results_dict[result_enum] = value
120125

126+
is_vulnerable_to_client_renegotiation_dos, client_renegotiations_success_count = results_dict[
127+
_ScanJobResultEnum.CLIENT_RENEG_RESULT
128+
]
121129
return SessionRenegotiationScanResult(
122-
is_vulnerable_to_client_renegotiation_dos=results_dict[
123-
_ScanJobResultEnum.IS_VULNERABLE_TO_CLIENT_RENEG_DOS
124-
],
130+
is_vulnerable_to_client_renegotiation_dos=is_vulnerable_to_client_renegotiation_dos,
125131
supports_secure_renegotiation=results_dict[_ScanJobResultEnum.SUPPORTS_SECURE_RENEG],
132+
client_renegotiations_success_count=client_renegotiations_success_count,
126133
)
127134

128135

@@ -163,9 +170,10 @@ def _test_secure_renegotiation(server_info: ServerConnectivityInfo) -> Tuple[_Sc
163170

164171
def _test_client_renegotiation(
165172
server_info: ServerConnectivityInfo, client_renegotiation_attempts: int
166-
) -> Tuple[_ScanJobResultEnum, bool]:
173+
) -> Tuple[_ScanJobResultEnum, Tuple[bool, int]]:
167174
"""Check whether the server honors session renegotiation requests."""
168175
# Try with TLS 1.2 even if the server supports TLS 1.3 or higher as there is no reneg with TLS 1.3
176+
client_renegotiations_success_count = 0
169177
if server_info.tls_probing_result.highest_tls_version_supported.value >= TlsVersionEnum.TLS_1_3.value:
170178
tls_version_to_use = TlsVersionEnum.TLS_1_2
171179
downgraded_from_tls_1_3 = True
@@ -198,6 +206,7 @@ def _test_client_renegotiation(
198206
# https://github.com/nabla-c0d3/sslyze/issues/473
199207
for i in range(client_renegotiation_attempts):
200208
ssl_connection.ssl_client.do_renegotiate()
209+
client_renegotiations_success_count += 1
201210
accepts_client_renegotiation = True
202211

203212
# Errors caused by a server rejecting the renegotiation
@@ -246,4 +255,4 @@ def _test_client_renegotiation(
246255
finally:
247256
ssl_connection.close()
248257

249-
return _ScanJobResultEnum.IS_VULNERABLE_TO_CLIENT_RENEG_DOS, accepts_client_renegotiation
258+
return _ScanJobResultEnum.CLIENT_RENEG_RESULT, (accepts_client_renegotiation, client_renegotiations_success_count)

tests/json_tests/sslyze_output.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8232,7 +8232,8 @@
82328232
"error_trace": null,
82338233
"result": {
82348234
"supports_secure_renegotiation": true,
8235-
"is_vulnerable_to_client_renegotiation_dos": false
8235+
"is_vulnerable_to_client_renegotiation_dos": false,
8236+
"client_renegotiations_success_count": 0
82368237
}
82378238
},
82388239
"session_resumption": {
@@ -17403,7 +17404,8 @@
1740317404
"error_trace": null,
1740417405
"result": {
1740517406
"supports_secure_renegotiation": true,
17406-
"is_vulnerable_to_client_renegotiation_dos": false
17407+
"is_vulnerable_to_client_renegotiation_dos": false,
17408+
"client_renegotiations_success_count": 0
1740717409
}
1740817410
},
1740917411
"session_resumption": {
@@ -17545,4 +17547,4 @@
1754517547
"date_scans_completed": "2024-02-24T18:51:11.055270",
1754617548
"sslyze_version": "6.0.0b0",
1754717549
"sslyze_url": "https://github.com/nabla-c0d3/sslyze"
17548-
}
17550+
}

tests/plugins_tests/test_session_renegotiation_plugin.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
SessionRenegotiationImplementation,
55
SessionRenegotiationScanResult,
66
SessionRenegotiationScanResultAsJson,
7+
SessionRenegotiationExtraArgument,
78
)
89

910
from sslyze.server_setting import (
@@ -40,17 +41,26 @@ def test_renegotiation_good(self) -> None:
4041
@can_only_run_on_linux_64
4142
def test_renegotiation_is_vulnerable_to_client_renegotiation_dos(self) -> None:
4243
# Given a server that is vulnerable to client renegotiation DOS
44+
expected_renegotiations_success_count = 3
45+
4346
with LegacyOpenSslServer() as server:
4447
server_location = ServerNetworkLocation(
4548
hostname=server.hostname, ip_address=server.ip_address, port=server.port
4649
)
50+
extra_arg = SessionRenegotiationExtraArgument(
51+
client_renegotiation_attempts=expected_renegotiations_success_count
52+
)
4753
server_info = check_connectivity_to_server_and_return_info(server_location)
4854

4955
# When testing for insecure reneg, it succeeds
50-
result: SessionRenegotiationScanResult = SessionRenegotiationImplementation.scan_server(server_info)
56+
result: SessionRenegotiationScanResult = SessionRenegotiationImplementation.scan_server(
57+
server_info,
58+
extra_arguments=extra_arg,
59+
)
5160

5261
# And the server is reported as vulnerable
5362
assert result.is_vulnerable_to_client_renegotiation_dos
63+
assert result.client_renegotiations_success_count == expected_renegotiations_success_count
5464

5565
# And a CLI output can be generated
5666
assert SessionRenegotiationImplementation.cli_connector_cls.result_to_console_output(result)

0 commit comments

Comments
 (0)