From e9750fb58d7da727bab0628959795d619e50502e Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Mon, 23 Mar 2015 18:04:40 +0300 Subject: [PATCH] Zero handshake and peer states after their usage Signed-off-by: Sergey Matveev --- cmd/govpn-client/main.go | 2 ++ cmd/govpn-server/main.go | 4 ++++ common.go | 7 +++++++ handshake.go | 19 +++++++++++++++++++ transport.go | 10 ++++++++++ 5 files changed, 42 insertions(+) diff --git a/cmd/govpn-client/main.go b/cmd/govpn-client/main.go index f4a29eb..82a89a6 100644 --- a/cmd/govpn-client/main.go +++ b/cmd/govpn-client/main.go @@ -93,6 +93,7 @@ func main() { MainCycle: for { if peer != nil && peer.Bytes > govpn.MaxBytesPerKey { + peer.Zero() peer = nil handshake = govpn.HandshakeStart(conn, remote, id, key) log.Println("Rehandshaking") @@ -132,6 +133,7 @@ MainCycle: firstUpCall = false } peer = p + handshake.Zero() handshake = nil } udpReady <- struct{}{} diff --git a/cmd/govpn-server/main.go b/cmd/govpn-server/main.go index 4fa5c96..1ce5a37 100644 --- a/cmd/govpn-server/main.go +++ b/cmd/govpn-server/main.go @@ -129,6 +129,7 @@ MainCycle: for addr, hs := range states { if hs.LastPing.Add(timeout).Before(now) { log.Println("Deleting handshake state", addr) + hs.Zero() delete(states, addr) } } @@ -143,6 +144,7 @@ MainCycle: ) go govpn.ScriptCall(downPath, state.tap.Name) state.terminate <- struct{}{} + state.peer.Zero() } } case peerReady = <-peerReadySink: @@ -152,6 +154,7 @@ MainCycle: } delete(peers, addr) state.terminate <- struct{}{} + state.peer.Zero() break } addr = peerReady.peer.Addr.String() @@ -160,6 +163,7 @@ MainCycle: continue } peers[addr] = state + states[addr].Zero() delete(states, addr) log.Println("Registered interface", peerReady.iface, "with peer", peer) go func(state *PeerState) { diff --git a/common.go b/common.go index b42673c..545274f 100644 --- a/common.go +++ b/common.go @@ -74,3 +74,10 @@ func KeyRead(path string) *[KeySize]byte { copy(key[:], keyDecoded) return key } + +// Zero each byte +func sliceZero(data []byte) { + for i := 0; i < len(data); i++ { + data[i] = '\x00' + } +} diff --git a/handshake.go b/handshake.go index c458f5d..44f9a29 100644 --- a/handshake.go +++ b/handshake.go @@ -69,6 +69,25 @@ func IsValidHandshakePkt(pkt []byte) bool { return true } +// Zero handshake's memory state +func (h *Handshake) Zero() { + sliceZero(h.rNonce[:]) + sliceZero(h.dhPriv[:]) + sliceZero(h.key[:]) + if h.rServer != nil { + sliceZero(h.rServer[:]) + } + if h.rClient != nil { + sliceZero(h.rClient[:]) + } + if h.sServer != nil { + sliceZero(h.sServer[:]) + } + if h.sClient != nil { + sliceZero(h.sClient[:]) + } +} + func (h *Handshake) rNonceNext() []byte { nonce := make([]byte, 8) nonceCurrent, _ := binary.Uvarint(h.rNonce[:]) diff --git a/transport.go b/transport.go index d72fcc1..31bfe7f 100644 --- a/transport.go +++ b/transport.go @@ -67,6 +67,16 @@ func (p *Peer) String() string { return p.Id.String() + ":" + p.Addr.String() } +// Zero peer's memory state +func (p *Peer) Zero() { + sliceZero(p.Key[:]) + sliceZero(p.tag[:]) + sliceZero(p.keyAuth[:]) + sliceZero(p.buf) + sliceZero(p.frame) + sliceZero(p.nonce) +} + var ( HeartbeatMark = []byte("\x00\x00\x00HEARTBEAT") Emptiness = make([]byte, KeySize) -- 2.48.1