﻿# V5313\. OWASP\. Do not use old versions of SSL/TLS protocols as it may cause security issues\.

Анализатор обнаружил использование в коде устаревших версий протоколов SSL/TLS\. Это может сделать приложение уязвимым к таким атакам, как man\-in\-the\-middle, BEAST, и т\.п\.

Проблемы, связанные с применением устаревших протоколов, могут быть отнесены к двум категориям [OWASP Top 10 2021](https://owasp.org/Top10/):

* [A2: Cryptographic Failures](https://owasp.org/Top10/A02_2021-Cryptographic_Failures/)
* [A7: Identification and Authentication Failures](https://owasp.org/Top10/A07_2021-Identification_and_Authentication_Failures/)

Рассмотрим пример:

```cpp
private void createSocket() {
    SSLContext sslContext;
    try {
        sslContext = SSLContext.getInstance("TLSv1");    // <=
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }

    try {
        sslContext.init(null, null, new SecureRandom());
        var socketFactory = sslContext.getSocketFactory();
        var socket = (SSLSocket) socketFactory.createSocket();

        // ....

        socket.close();
    } catch (KeyManagementException | IOException e) {
        throw new RuntimeException(e);
    }
}
```

В указанном фрагменте используется значение `TLSv1`, представляющее протокол TLS версии 1\.0\. Данная версия является устаревшей и не рекомендуется к использованию, так как TLS 1\.0 уязвим к ряду атак, в числе которых упоминавшаяся ранее BEAST\.

Рекомендуется использовать более новые версии протоколов, например, TLS 1\.2:

```cpp
private void createSocket() {
    SSLContext sslContext;
    try {
        sslContext = SSLContext.getInstance("TLSv1.2");
    } catch (NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }

    try {
        sslContext.init(null, null, new SecureRandom());
        var socketFactory = sslContext.getSocketFactory();
        var socket = (SSLSocket) socketFactory.createSocket();

        // ....

        socket.close();
    } catch (KeyManagementException | IOException e) {
        throw new RuntimeException(e);
    }
}
```

Версии протоколов, являющиеся более старыми, чем TLS 1\.2, не рекомендуются к использованию из\-за возможных проблем с безопасностью\. К таким протоколам относятся SSL версий 2\.0 и 3\.0, а также TLS версий 1\.0 и 1\.1\.

Как правило, наиболее подходящим значением является `TLS`, представляющее выбор протокола передачи данных платформе\. Если по каким\-либо причинам данное значение не подходит, то рекомендуется задавать самую новую версию из доступных\.

## Дополнительные ссылки

* [Transport Layer Security \(TLS\) Protocol Overview](https://docs.oracle.com/en/java/javase/21/security/transport-layer-security-tls-protocol-overview.html)
* [Testing for Weak SSL TLS Ciphers Insufficient Transport Layer Protection](https://owasp.org/www-project-web-security-testing-guide/v41/4-Web_Application_Security_Testing/09-Testing_for_Weak_Cryptography/01-Testing_for_Weak_SSL_TLS_Ciphers_Insufficient_Transport_Layer_Protection)
* [Transport Layer Security Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Security_Cheat_Sheet.html)
* [Описание атаки Man\-in\-the\-middle](https://owasp.org/www-community/attacks/Manipulator-in-the-middle_attack)
* [Описание атаки Man\-in\-the\-Browser](https://owasp.org/www-community/attacks/Man-in-the-browser_attack)