** Description changed:

- Recently, we are trying to find SSL security problems by static
- analysis. For example, as we all know, Hostname verification is an
- important step when verifying X509 certificates, however, people tend to
- miss the step or to misunderstand the APIs when using SSL/TLS, which
- might cause severe man in the middle attack and break the entire TLS
- mechanism. And static analysis is a way of finding whether the APIs are
- called correctly.
+ Recently, our group is trying to find SSL security problems by static
+ analysis. When using Openssl, people tend to miss the step or to
+ misunderstand the APIs when using SSL/TLS, which might cause severe man
+ in the middle attack and break the entire TLS mechanism. And static
+ analysis is a way of finding whether the APIs are called correctly.
+ 
+ The source code we analysis was from ubuntu: apt-get source <package 
name>.And we use this command in Ubuntu 12.04.
+ Now we just check whether a software verify the certitiface chain when using 
Openssl.
+ 
+ 一. How we ensure whether a software check the certificate chain or not?
+ We make a matching algorithm. If source code doesn't match this, the software 
is not secure.
+ 
+ Typically, when Openssl clients want to verify a certificate, there are
+ the following choices:
+ 
+ 1. Using built-in certificate verification(chain of trust verification, 
expired validation, etc)
+ [Example 1]
+  /**
+      * set VERIFY_PEER flag before the establishment of a SSL connection
+      * OPENSSL will drop connection during handshake if verification fails
+      * No custom callback function used.
+   */
+  SSL_CTX_set_verify(ctx,VERIFY_PEER,NULL);
+ 
+ [Example 2]
+ 
+ //check the built-in verification result after the SSL handshake
+ 
+ if(SSL_get_peer_certificate(ssl)!=NULL && 
SSL_get_verify_result(ssl)==X509_V_OK)
+ {
+    //PASS
+ }
+ else
+ {
+   //FAIL
+ }
+ 
+ 2. Using custom verification.
+ 
+ [Example 3]
+ X509* usrcert = SSL_get_peer_certificate(ssl);
+ rootCertStore = X509_STORE_new();
+ .. ..
+ ctx = X509_STORE_CTX_new();
+ ret = X509_STORE_CTX_init(ctx,rootCertStore,usrCert,NULL);
+ ret = X509_verify_cert(ctx)
+ 
+ This example read the certificate out using SSL_get_peer_certificate
+ API. Then it use X509 API suite to do certificate verification. X509 API
+ is part of OPENSSL library. Theoretically, a developer can use any API
+ in any libraries to do this verification, but in practice, we only
+ identify the case above: using X509 API suite.
+ 
+ 3. Add restrictions or relaxations to built-in certificate verification
+ 
+ The built-in certificate verification in OPENSSL library can be extended by 
using custom callback functions. By default, this callback option is NULL, 
indicating completely use built-in verification.
+ By adding this callback function, the developer can decide if they accept the 
verify result by openssl, and they can modify the result whenever they what.
+ 
+ [Example 4]
+ SSL_CTX_set_verify(ctx,VERIFY_PEER,mycallback);
+ static mycallback(int preverify_ok, X509_STORE_CTX *ctx)
+ {
+ ....
+ ....
+ return preverify_ok;
+ }
+ 
+ 二. The analysis result
  
  Now, we find some SSL problems in dma, the following is details:
  
  -----------------------------------------------------------------------------
  file : dma/dma-0.0.2010.06.17/crypto.c
  -----------------------------------------------------------------------------
  function : smtp_init_crypto
  -----------------------------------------------------------------------------
  SSL method : \
  -----------------------------------------------------------------------------
  call SSL_CTX_set_verify() : NOT FOUND
  -----------------------------------------------------------------------------
  Have SSL_CTX_set_verify ( SSL_set_verify) callback : NO
  -----------------------------------------------------------------------------
  call SSL_get_peer_certificate(): YES (but NO X509 suite API for custom 
verification)
  -----------------------------------------------------------------------------
  call SSL_get_verify_result(): NO
  -----------------------------------------------------------------------------
  
  According to the above result, we think the SSL connection in dma is not
- secure. For instance, missing hostname  or expired time check when
- verifying x509  certificate.
+ secure.
  
- More specifically , we can take function SSL_CTX_set_verify() for
- example, when using OPENSSL, if we call SSL_CTX_set_verify(ssl_ctx,
- SSL_VERIFY_NONE, null), we should verify the certificate by calling the
- function SSL_get_peer_certificate() to get the certificate at first.
- Then use X509 APIs or self-define function to verify the certificate we
- get. If the source code does not match this model, then we can deduce
- this code is vulnerable. And other APIs have similar problems.
+ 三. How we prove the result we got?
  
  To verify the result we make, we attack the software manually.
  
  At first, we should configure the software environment:
  1. configure the file /etc/dma/dma.conf:
  # $DragonFly: src/etc/dma/dma.conf,v 1.2 2008/02/04 10:11:41 matthias Exp $
  #
  # Your smarthost (also called relayhost).  Leave blank if you don't want
  # smarthost support.
  # NOTE: on Debian systems this is handled via debconf!
  # Please use dpkg-reconfigure dma to change this value.
  #SMARTHOST
  SMARTHOST smtp.gmail.com
  
  # Use this SMTP port.  Most users will be fine with the default (25)
  #PORT 25
  PORT 587
  
  # Path to your alias file.  Just stay with the default.
  #ALIASES /etc/aliases
  
  # Path to your spooldir.  Just stay with the default.
  #SPOOLDIR /var/spool/dma
  
  # SMTP authentication
  AUTHPATH /etc/dma/auth.conf
  
  # Uncomment if yout want TLS/SSL support
  SECURETRANSFER
  
  # Uncomment if you want STARTTLS support (only used in combination with
  # SECURETRANSFER)
  STARTTLS
  
  # Uncomment if you have specified STARTTLS above and it should be allowed
  # to fail ("opportunistic TLS", use an encrypted connection when available
  # but allow an unencrypted one to servers that do not support it)
  #OPPORTUNISTIC_TLS
  
  # Path to your local SSL certificate
  #CERTFILE
  
  # If you want to use plain text SMTP login without using encryption, change
  # the SECURE entry below to INSECURE.  Otherwise plain login will only work
  # over a secure connection.  Use this option with caution.
  INSECURE
  
  # Uncomment if you want to defer your mails.  This is useful if you are
  # behind a dialup line.  You have to submit your mails manually with dma -q
  #DEFER
  
  # Uncomment if you want the bounce message to include the complete original
  # message, not just the headers.
  #FULLBOUNCE
  
  # The internet hostname dma uses to identify the host.
  # If not set or empty, the result of gethostname(2) is used.
  # If MAILNAME is an absolute path to a file, the first line of this file
  # will be used as the hostname.
  # NOTE: on Debian systems this is handled via debconf!
  # Please use dpkg-reconfigure dma to change this value.
  MAILNAME /etc/mailname
  
  # Masquerade envelope from addresses with this address/hostname.
  # Use this if mails are not accepted by destination mail servers because
  # your sender domain is invalid.
  # By default, MASQUERADE is not set.
  # Format: MASQUERADE [user@][host]
  # Examples:
  # MASQUERADE john@  on host "hamlet" will send all mails as john@hamlet
  # MASQUERADE percolator  will send mails as $username@percolator, e.g. 
fish@percolator
  # MASQUERADE herb@ert  will send all mails as herb@ert
  
  2. configure the file /etc/dma/auth.conf:
  # $DragonFly: src/etc/dma/auth.conf,v 1.1 2008/02/02 18:24:00 matthias Exp $
  #
  # SMTP authentication entries (currently AUTH LOGIN only)
  # Format: user|my.smarthost.example.com:password
  598105...@qq.com|smtp.gmail.com:Password
  
  3. configure ~/.muttrc:
  set sendmail="/usr/sbin/dma -f 598105...@qq.com"
  set folder="~/Mail"
  set mbox="~/Mail/inbox"
  #set mbox_type=maildir
  set spoolfile="~/Mail/inbox"
  set postponed="~/Mail/postponed"
  set record="~/Mail/sent"
  my_hdr From: 598105...@qq.com
  
  Ok ,let's start!
  
- 一.Hostname verification
- 1. change /etc/hosts in order to simulate the DNS hijack
-      182.254.3.179   smtp.gmail.com
-    (182.254.3.179 is a normal smtp server)
- 
- 2. use mutt  to send the mail ( mutt use dma as a MTA)
- 
- 3. result : receivethe mail !
- 
- The fetch succeeded, indicating the software didn't check the hostname
- against the signee of the certificate.
- 
- 二. Also for expired time check,
+ for expired time check,
  1. change the system time to 2200 to guarantee the certificate to be expired.
  
  2. run mutt to send email
  
  3. result:succeed!!
  
  The fetch succeeded again and no warning was given, indicating the
  software didn't check whether the certificate expired or not.
  
  PS: I have saved the SSL connection Wireshark packages, and upload these 
files.
  for more information, you can see the paper: 
http://people.stfx.ca/x2011/x2011ucj/SSL/p38-georgiev.pdf
  and more details you can contact with us, we will be very glad for your 
responce.
  
  Thanks.

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1380458

Title:
  dma have some SSL security problems

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/dma/+bug/1380458/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to