Tls Security
Tls Security
RFC
(request for
comments) Analysis
Find error Tool
Request for Comments
• Network protocols are defined in an RFC
• TLS version 1.0 is described in RFC 2246
• Intended to be a self-contained definition
of the protocol
▫ Describes the protocol in sufficient detail for
readers who will be implementing it and
those who will be doing protocol analysis
(that’s you!)
▫ Mixture of informal prose and pseudo-code
• Read some RFCs to get a flavor of what
protocols look like when they emerge from
the committee
Evolution of the SSL/TLS RFC
80
70
60
50
40
Page count
30
20
10
0
SSL 2.0 SSL 3.0 TLS 1.0
From RFC to MurModel
Informal
Formal Intruder
Protocol
Protocol Model
Description
Mur code
RFC
Analysis
Find error Tool
TLS Basics
• TLS consists of two protocols
• Handshake protocol
▫ Use public-key cryptography to establish a
shared secret key between the client and the
server
• Record protocol
▫ Use the secret key established in the
handshake protocol to protect communication
between the client and the server
• We will focus on the handshake protocol
TLS
• TwoHandshake Protocol
parties: client and server
• Negotiate version of the protocol and the
set of cryptographic algorithms to be used
▫ Interoperability between different
implementations of the protocol
• Authenticate client and server (optional)
▫ Use digital certificates to learn each other’s
public keys and verify each other’s identity
• Use public keys to establish a shared
secret
Handshake Protocol Structure
ClientHello
ServerHello,
[Certificate],
[ServerKeyExchange],
[CertificateRequest],
ServerHelloDone
C [Certificate],
ClientKeyExchange,
S
[CertificateVerify]
C Secret key K
encrypted with
S
server’s key Ks
Server certificate can be verified by any client that has CA verification key Ka
Certificate authority is “off line”
Another general idea in SSL
• Client, server communicate
Hi
Hello
Client Server
How are you?
SSL/TLS
ClientHello
CS
inC,more detail …
Ver , Suite , N C C C
C S
ClientHello
struct { (RFC) Highest version of the
protocol supported by the
client
ProtocolVersion client_version;
Random random; Session id (if the client
wants to resume an old
SessionID session_id; session)
Cryptographic algorithms
CipherSuite cipher_suites; supported by the client
(e.g., RSA or Diffie-Hellman)
CompressionMethod
compression_methods;
} ClientHello
ClientHello
ruleset j: ServerId do (Mur)
ruleset i: ClientId do
ServerHello
C
• Highest protocol version both
client &
server support
S
• Strongest cryptographic suite
selected
from those offered by the client
ServerHello (Mur)
ruleset i: ServerId do
choose l: serNet do
rule “Server receives ServerHello (new session)"
ser[i].clients[0].state = M_CLIENT_HELLO &
serNet[l].dest = i &
serNet[l].session = 0
==>
var
inM: Message; -- incoming message
outM: Message; -- outgoing message
begin
inM := serNet[l]; -- receive message
if inM.mType = M_CLIENT_HELLO then
outM.source := i;
outM.dest := inM.source;
outM.session := freshSessionId();
outM.mType := M_SERVER_HELLO;
outM.version := ser[i].version;
outM.suite := ser[i].suite;
outM.random := freshNonce();
multisetadd (outM, serNet);
ser[i].state := M_SERVER_SEND_KEY;
end; end; end;
ServerKeyExchange
C, Versionc, suitec, Nc
C ClientKeyExchange
S
Client generates some secret key
material
and sends it to the server encrypted
with
the server’s public key
ClientKeyExchange
struct { (RFC) Let’s model this as
{Secretc}Ks
select (KeyExchangeAlgorithm) {
case rsa: EncryptedPreMasterSecret;
case diffie_hellman:
ClientDiffieHellmanPublic;
} exchange_keys
} ClientKeyExchange
struct {
ProtocolVersion client_version;
opaque random[46];
} PreMasterSecret
“Core” SSL
C, Versionc, suitec, Nc
C {Secretc}Ks
S
If the protocol is correct, C and S share
some secret key material secretc at this point
ServerHell
o
M_SERVER_HELLO M_SEND_KEY
ServerKeyExchang
e
M_SERVER_KEY M_CLIENT_KEY
M_SEND_KEY M_DONE
ClientKeyExchange
IntruderModel
Informal
Formal Intruder
Protocol
Protocol Model
Description
ruleset i: IntruderId do
choose l: cliNet do
rule "Intruder intercepts client's message"
cliNet[l].fromIntruder = false
==>
begin
alias msg: cliNet[l] do -- message from the net
…
alias known: int[i].messages do
if multisetcount(m: known,
msgEqual(known[m], msg)) = 0 then
multisetadd(msg, known);
end;
end;
end;
Intruder Can Decrypt if Knows
Key
• If the key is stored in the data structure modeling
intruder’s “knowledge”, then read message
ruleset i: IntruderId do
choose l: cliNet do
rule "Intruder intercepts client's message"
cliNet[l].fromIntruder = false
==>
begin
alias msg: cliNet[l] do -- message from the net
…
if msg.mType = M_CLIENT_KEY_EXCHANGE then
if keyEqual(msg.encKey, int[i].publicKey.key) then
alias sKeys: int[i].secretKeys do
if multisetcount(s: sKeys,
keyEqual(sKeys[s], msg.secretKey)) = 0 then
multisetadd(msg.secretKey, sKeys);
end;
end;
end;
Intruder Can Create New
Messages
• Assemble pieces stored in the intruder’s
“knowledge” to form a message of the right format
ruleset i: IntruderId do
ruleset d: ClientId do
ruleset s: ValidSessionId do
choose n: int[i].nonces do
ruleset version: Versions do
rule "Intruder generates fake ServerHello"
cli[d].state = M_SERVER_HELLO
==>
var
outM: Message; -- outgoing message
begin
outM.source := i; outM.dest := d; outM.session := s;
outM.mType := M_SERVER_HELLO;
outM.version := version;
outM.random := int[i].nonces[n];
multisetadd (outM, cliNet);
end; end; end; end;
Intruder Model and
• There is no actual cryptography in our model
Cryptography
▫ Messages are marked as “encrypted” or “signed”,
and the intruder rules respect these markers
• Our assumption that cryptography is perfect is
reflected in the absence of certain intruder
rules
▫ There is no rule for creating a digital signature
with a key that is not known to the intruder
▫ There is no rule for reading the contents of a
message which is marked as “encrypted” with a
certain key, when this key is not known to the
intruder
▫ There is no rule for reading the contents of a
“hashed” message
Running Mur Analysis
Informal
Formal Intruder
Protocol
Protocol Model
Description
Specify security
conditions and run
Mur
Secrecy
• Intruder should not be able to learn the
secret generated by the client
ruleset i: ClientId do
ruleset j: IntruderId do
rule "Intruder has learned a client's secret"
cli[i].state = M_DONE &
multisetcount(s: int[j].secretKeys,
keyEqual(int[j].secretKeys[s], cli[i].secretKey)) > 0
==>
begin
error "Intruder has learned a client's secret"
end;
end;
end;
Shared Secret
• After the protocol hasConsistency
finished, client and server
should agree on their shared secret
ruleset i: ServerId do
ruleset s: SessionId do
rule "Server's shared secret is not the same as its client's"
ismember(ser[i].clients[s].client, ClientId) &
ser[i].clients[s].state = M_DONE &
cli[ser[i].clients[s].client].state = M_DONE &
!keyEqual(cli[ser[i].clients[s].client].secretKey,
ser[i].clients[s].secretKey)
==>
begin
error "S's secret is not the same as C's"
end;
end;
end;
Version and Crypto Suite
Consistency
• Client and server should be running the highest
version of the protocol they both support
ruleset i: ServerId do
ruleset s: SessionId do
rule "Server has not learned the client's version or suite
correctly"
!ismember(ser[i].clients[s].client, IntruderId) &
ser[i].clients[s].state = M_DONE &
cli[ser[i].clients[s].client].state = M_DONE &
(ser[i].clients[s].clientVersion != MaxVersion |
ser[i].clients[s].clientSuite.text != 0)
==>
begin
error "Server has not learned the client's version or suite
correctly"
end;
end;
end;
Finite-State Verification
Mur rules for protocol
participants and the
intruder define a
nondeterministic state
transition graph
...
...
Mur will exhaustively
enumerate all graph nodes
Mur will verify whether
specified security conditions
Correctness
hold in every reachable
condition violated node
If not, the path to the
When Does MurFind a
Violation?
• Bad abstraction
▫ Removed too much detail from the protocol when
constructing the abstract model
▫ Add the piece that fixes the bug and repeat
▫ This is part of the rational reconstruction process
• Genuine attack
▫ Yay! Hooray!
▫ Attacks found by formal analysis are usually quite
strong: independent of specific cryptographic
schemes, OS implementation, etc.
▫ Test an implementation of the protocol, if
available
“Basic” SSL 3.0
C, Versionc=3.0, suitec
Versions=3.0, suites
sigca(S,Ks),
“ServerHelloDone”
C {Secretc}Ks
S
If the protocol is correct, C and S share
some secret key material secretc at this point
C {Secretc}Ks
S
Versions=3.0, suites
sigca(S,Ks),
Prevents “ServerHelloDone”
version
C
rollback attack
{Versionc,Secretc}Ks
Add rule to check that received
version is equal to version in
ClientHello
S
If the protocol is correct, C and S share
some secret key material secretc at this point
Versions, suites, Ns
Server public key in
certificate signed by sigca(S,Ks),
CA “ServerHelloDone”
C {Versionc,Secretc}Ks S
switch to negotiated cipher
Hash messages to
confirm consistent
views
Anomaly (Protocol F)
… SuiteC …
… SuiteS …
…
data data
Anomaly (Protocol F)
o d ifCy…
… Suite
M
d i
S y
… Suite f…
M…o
data data
Protocol Resumption
SessionId, VerC= 3.0, NC, ...
C Finished Finished S
data data
Version Rollback Attack
SessionId, VerC= 2.0, NC, ...
C
X
Finished
{ NS } SecretKey
X
Finished
{ NC } SecretKey
S
data data