CVE-2016-2183 OpenSSL Sweet32 Birthday Attack

最近安全掃描時發現OpenSSL 1.0的這個問題,從編號可以看出這是2016年發現的老問題。Birthday Attack這個術語來源於生日問題:在一個教室中最少應有多少學生才使得至少有兩個學生的生日在同一天的概率不小於1/2?答案是23。如60人以上,概率大於99%,如70人以上,概率大於99.9%。
OpenSSL 1.0支持DES/3DES算法,DES/3DES僅是64位的分組密碼算法,在兩天內即可破解。OpenSSL 1.0.2、1.0.1將DES/3DES算法從“HIGH”降到“MEDIUM”,但默認仍是支持的。OpenSSL 1.1默認不編譯DES/3DES。

OpenSSL 1.0編譯時,可禁用DES:

# ./config --prefix=/usr --no-des --shared
# make
# make install

查看OpenSSL支持的算法:

openssl ciphers -v

下面是一些常用服務的解決方法:

OpenSSH

目前OpenSSH僅支持OpenSSL 1.0,且編譯時要用到DES算法。因此通常做法是在配置文件ssh_config/sshd_config中設定Ciphers:

Ciphers aes256-ctr,aes192-ctr,aes128-ctr

查看ssh支持的算法:

ssh -Q cipher

Apache

編輯ssl.conf,禁用老的協議,配置SSLCipherSuite:

SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH

Subversion Edge

Subversion Edge使用了jetty服務器,編輯appserver/etc/svnedge-ssl.xml,排除DES算法:

<New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
 <Arg>
   <New id="sslContextFactory" class="org.eclipse.jetty.http.ssl.SslContextFactory">
     <Set name="ExcludeProtocols">
       <Array type="java.lang.String">
         <Item>TLSv1</Item>
         <Item>SSLv2</Item>
         <Item>SSLv3</Item>
       </Array>
     </Set>
     <Set name="ExcludeCipherSuites">
       <Array type="java.lang.String">
         <Item>.*DES.*</Item>
       </Array>
     </Set>
   </New>
 </Arg>
 ...
</New>

Tomcat

配置Connector的ciphers項:

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true" clientAuth="false" sslProtocol="TLS"
           keystoreFile="${user.home}/.keystore" keystorePass="changeit" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"/>

ciphers支持兩種語法:JSSE和OpenSSL,Tomcat 9默認值爲:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!kRSA

Jboss EAP 6

<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" secure="true">
    <ssl name="https" ... cipher-suite="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA"/>
</connector>

cipher-suite支持兩種語法:JSSE和OpenSSL,默認值是HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5

Jboss EAP 7

<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true" enabled-protocols="TLSv1.2" 
    enabled-cipher-suites="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA"/>

enabled-cipher-suites支持兩種語法:JSSE和OpenSSL,默認是JVM的默認值。

JSSE

JDK 1.7.0_75以後的版本,java.security配置文件中提供了jdk.tls.disabledAlgorithms參數,可以配置禁用的算法:

jdk.tls.disabledAlgorithms=SSLv3,DESede,DES

參考文檔

OpenSSL
OpenSSH
The SWEET32 Issue, CVE-2016-2183
Jboss EAP 6.4 Securing the Server and Its Interfaces
Jboss EAP 7.1 Securing the Server and Its Interfaces

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章