2012-04-13 2 views
3

우리는 고유 한 Apache Portable Runtime SSL 커넥터를 사용하여 Tomcat 6에서 웹 응용 프로그램을 실행하여 SSL 연결을 제공합니다. BEAST 공격을 막기 위해 어떻게 서버를 구성 할 수 있습니까? 제안 된 솔루션 (1)은 SSLHonorCipherOrder 매개 변수 (2)를 설정할 수 없으므로 Tomcat 구성에서 구성 할 수 없습니다. 하지만 사용하여 스캔 SSL 서버 테스트 쇼tomcat을 보호하십시오 6 apr SSL을 BEAST 공격을받습니다

우리는 현재는 설정 SSLCipherSuite = ": AES256-SHA256 : RC4 : HIGH! MD5 :! aNULL :! : EDH! AESGCM ECDHE-RSA-AES256-SHA384"를 사용 서버는 여전히 BEAST 공격에 취약합니다. Tomcat과 Apache 프록시를 접함으로써이 문제를 해결할 수 있다는 것을 알고 있지만,이 변화는 단기간에 구현하기에는 너무 침해 적입니다. 지원을 추가하기 위해 Tomcat을 패치 할 수도 있지만 정책을 위반하는 Tomcat 패키지의 자동 업데이트를 막을 수 있습니다.

1 https://community.qualys.com/blogs/securitylabs/2011/10/17/mitigating-the-beast-attack-on-tls

2 http://tomcat.apache.org/tomcat-6.0-doc/apr.html

답변

1

내가 내 솔루션이 게시하지 않습니다. 해킹 비트이지만 JSSE 나 Tomcat을 패치/재 컴파일 할 필요가 없습니다.

/* 
SSLSettingHelper prevents BEAST SSL attack by setting the appropriate option. 
Due to protected variable must be in org.apache.tomcat.util.net package... 
Instruction: 
1) Compile and place JAR in tomcat /lib 
2) Add protocol="org.apache.tomcat.util.net.SSLSettingHelper" to SSL APR connector 
*/ 
package org.apache.tomcat.util.net; 

public class SSLSettingHelper extends org.apache.coyote.http11.Http11AprProtocol { 
    @Override 
    public void init() throws Exception { 
     super.init(); 
     org.apache.tomcat.jni.SSLContext.setOptions(endpoint.sslContext, org.apache.tomcat.jni.SSL.SSL_OP_CIPHER_SERVER_PREFERENCE); 
     log.info("SSLSettingHelper set SSL_OP_CIPHER_SERVER_PREFERENCE to prevent BEAST SSL attack"); 
    } 
} 

다음이 헬퍼 클래스를 사용하여 커넥터를 구성 :

<Connector server="Server" protocol="org.apache.tomcat.util.net.SSLSettingHelper" port="8443" maxThreads="256" scheme="https" secure="true" SSLEnabled="true" SSLCertificateFile="..." SSLCertificateKeyFile="..." SSLCertificateChainFile="..." SSLCipherSuite="ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM" compression="on" compressableMimeType="text/html,text/xml,text/plain,application/json,text/css,text/javascript" maxPostSize="1024000"/> 

이 짐승의 공격을 수정

는 다음과 같은 클래스를 만듭니다.

2

톰캣이 질라 링크 보듯 톰캣 7.0.30에 통합 될 것으로 보인다 CipherOrder 지시자를 구현하는 동안이 문제를 해결하는 논리적 방법 앞으로. 나는 이것을 시도하는 데 가장 관심이 있으며, 노력한 후에 피드백을 줄 것이다. https://issues.apache.org/bugzilla/show_bug.cgi?id=53481

+0

위에서 언급 한 버그 보고서에 Tomcat 6에 대한 CipherOrder 지시문이 제안되어 있지만 (8 월 말) 아직 구현되지 않았다는 증거는 없습니다. Tomcat 6의 BEAST 공격에 대한 명확한 해결책이 있습니까? 우리는 Tomcat 6.0.35 및 JRE 1.6.0_38을 실행 중이고 Trustwave 및 SSL Labs (https://www.ssllabs.com/ssltest/) 컴플라이언스 검사에 실패했습니다. –

+0

2013 년 1 월의 최신 버그 업데이트 : [Tomcat 6.0.x에서 수정되었습니다. Tomcat 6.0.37에 있습니다.] (https://issues.apache.org/bugzilla/show_bug.cgi?id=53481#c7) –

+0

변경 사항은 이제 tomcat 6.x 및 7.x에 있습니다. 문서에서 구성 옵션 (SSLHonorCipherOrder)을 볼 수 있습니다. http://tomcat.apache.org/tomcat-7.0-doc/config/http.html 그러나이 옵션을 활성화했습니다 (서버의 내 커넥터에 추가됨). xml, with tomcat 7.0.40), https://www.ssllabs.com/ssltest에서 짐승 공격 실패 메시지를 제거하지 않았습니다. – Keith

0

plain java에서 "SSLHonorCipherOrder"와 같은 방법을 사용할 수있는 해결책을 발견했습니다. 서버 클래스 주문 을 얻기 위해 (bootclasspath)를 통해 원래 Sun JSSE에 패치를 적용합니다.

등급 : sun.security.ssl.ServerHandshaker

필드가

public static boolean preferServerOrder = true;

방법 chooseCipherSuite 교체 추가

private void chooseCipherSuite(final HandshakeMessage.ClientHello mesg) throws IOException { 
    if(preferServerOrder) { 
     final CipherSuiteList clientList = mesg.getCipherSuites(); 
     for(final CipherSuite serverSuite : getActiveCipherSuites().collection()) { 
      if (this.doClientAuth == 2) { 
       if (serverSuite.keyExchange == CipherSuite.KeyExchange.K_DH_ANON) continue; 
       if (serverSuite.keyExchange == CipherSuite.KeyExchange.K_ECDH_ANON) continue; 
      } 
      if(!serverSuite.isNegotiable()) continue; 
      if(clientList.contains(serverSuite)) { 
       if (trySetCipherSuite(serverSuite)) return; 
      } 
     } 
    } else { 
     final Collection list = mesg.getCipherSuites().collection(); 
     for(final CipherSuite suite : list) { 
      if (!(isNegotiable(suite))) continue; 
      if (this.doClientAuth == 2) { 
       if (suite.keyExchange == CipherSuite.KeyExchange.K_DH_ANON) continue; 
       if (suite.keyExchange == CipherSuite.KeyExchange.K_ECDH_ANON) continue; 
      } 
      if (trySetCipherSuite(suite)) return; 
     } 
    } 
    fatalSE(Alerts.alert_handshake_failure, "no cipher suites in common"); 
}
관련 문제