Skip to content

Commit f364cb3

Browse files
committed
kontrol: deny self-signed kite keys
1 parent 2923c3d commit f364cb3

File tree

4 files changed

+82
-13
lines changed

4 files changed

+82
-13
lines changed

kontrol/handlers.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (k *Kontrol) HandleRegister(r *kite.Request) (interface{}, error) {
5555
keyPair, err = k.keyPair.GetKeyFromPublic(strings.TrimSpace(publicKey))
5656
if err != nil {
5757
newKey = true
58-
keyPair, err = k.pickKey(r)
58+
keyPair, err = k.pickKey(r, false)
5959
if err != nil {
6060
return nil, err // nothing to do here ..
6161
}
@@ -248,7 +248,9 @@ func (k *Kontrol) HandleMachine(r *kite.Request) (interface{}, error) {
248248
}
249249
}
250250

251-
keyPair, err := k.pickKey(r)
251+
// TODO(rjeczalik): add test and ensure no identity is leaked
252+
253+
keyPair, err := k.pickKey(r, true)
252254
if err != nil {
253255
return nil, err
254256
}
@@ -279,15 +281,15 @@ func (k *Kontrol) HandleGetKey(r *kite.Request) (interface{}, error) {
279281
return publicKey, nil
280282
}
281283

282-
keyPair, err := k.pickKey(r)
284+
keyPair, err := k.pickKey(r, false)
283285
if err != nil {
284286
return nil, err
285287
}
286288

287289
return keyPair.Public, nil
288290
}
289291

290-
func (k *Kontrol) pickKey(r *kite.Request) (*KeyPair, error) {
292+
func (k *Kontrol) pickKey(r *kite.Request, self bool) (*KeyPair, error) {
291293
if k.MachineKeyPicker != nil {
292294
keyPair, err := k.MachineKeyPicker(r)
293295
if err != nil {
@@ -296,14 +298,9 @@ func (k *Kontrol) pickKey(r *kite.Request) (*KeyPair, error) {
296298
return keyPair, nil
297299
}
298300

299-
if len(k.lastPublic) != 0 && len(k.lastPrivate) != 0 {
300-
return &KeyPair{
301-
Public: k.lastPublic[len(k.lastPublic)-1],
302-
Private: k.lastPrivate[len(k.lastPrivate)-1],
303-
ID: k.lastIDs[len(k.lastIDs)-1],
304-
}, nil
301+
if !self {
302+
return nil, errors.New("no valid authentication key found")
305303
}
306304

307-
k.log.Error("neither machineKeyPicker nor public/private keys are available")
308-
return nil, errors.New("internal error - 1")
305+
return k.KeyPair()
309306
}

kontrol/http.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func (k *Kontrol) HandleRegisterHTTP(rw http.ResponseWriter, req *http.Request)
113113
Type: args.Auth.Type,
114114
Key: args.Auth.Key,
115115
},
116-
})
116+
}, false)
117117
if err != nil {
118118
http.Error(rw, jsonError(err), http.StatusBadRequest)
119119
return

kontrol/kontrol_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414

1515
"github.com/dgrijalva/jwt-go"
1616
"github.com/koding/kite"
17+
"github.com/koding/kite/config"
1718
"github.com/koding/kite/kitekey"
1819
"github.com/koding/kite/protocol"
1920
"github.com/koding/kite/testkeys"
@@ -117,6 +118,39 @@ func TestRegisterMachine(t *testing.T) {
117118
}
118119
}
119120

121+
func TestRegisterDenyEvil(t *testing.T) {
122+
evil := kite.New("evil", "1.0.0")
123+
evil.Config = config.New()
124+
evil.Config.Port = 6767
125+
evil.Config.Username = "evil"
126+
evil.Config.KontrolUser = "evil"
127+
evil.Config.KontrolURL = conf.Config.KontrolURL
128+
evil.Config.KiteKey = testutil.NewToken("evil", testkeys.PrivateEvil, testkeys.PublicEvil).Raw
129+
// KontrolKey can be easily extracted from existing kite.key
130+
evil.Config.KontrolKey = testkeys.Public
131+
evil.Config.ReadEnvironmentVariables()
132+
133+
evilURL := &url.URL{
134+
Scheme: "http",
135+
Host: "127.0.0.1:6767",
136+
Path: "/kite",
137+
}
138+
139+
_, err := evil.Register(evilURL)
140+
if err == nil {
141+
t.Errorf("expected kontrol to deny register request: %s", evil.Kite())
142+
} else {
143+
t.Logf("register denied: %s", err)
144+
}
145+
146+
_, err = evil.GetToken(evil.Kite())
147+
if err == nil {
148+
t.Errorf("expected kontrol to deny token request: %s", evil.Kite())
149+
} else {
150+
t.Logf("token denied: %s", err)
151+
}
152+
}
153+
120154
func TestTokenInvalidation(t *testing.T) {
121155
oldval := TokenTTL
122156
defer func() {

testkeys/testkeys.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,44 @@ QFlWPjxAFIYGiUSp8zpbPE12qXqXmFJekOriXHpdLI4jwhsTaoH/4xZNmKDAagHH
126126
mQIDAQAB
127127
-----END PUBLIC KEY-----`
128128

129+
const PublicEvil = `-----BEGIN PUBLIC KEY-----
130+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs4KnPdBHaS1RIjECBiu2
131+
V6iRkO7Nf1q6icMLUHBfMhJiWQbS7knFNSfCJ59Zb7girQixJLvMELHn6rgVg1nb
132+
RiUChBCxGul9NU/Gq5Xk0GzP4CiMmKFwd3DZeai3Tsod9txu/3nmJA6Cl40hXTXc
133+
2gNSceBCsNz6WBTpp5QHOBntV516ObtN2GUAyuk5XqiCTwGXCL/Sn6QyEEkTdhaT
134+
g2f//HxPWRR9Wy5juXQxblmJUa3yMUTQ255OW0a8mQa/Lg015SwXhDrPsgkh/5qV
135+
z/J79rCi0ej9Bkh17+0V0EctML50R1y94JPn+KQ7IbzItahz0j8zmtbDcpAwkdmO
136+
lQIDAQAB
137+
-----END PUBLIC KEY-----`
138+
139+
const PrivateEvil = `-----BEGIN RSA PRIVATE KEY-----
140+
MIIEogIBAAKCAQEAs4KnPdBHaS1RIjECBiu2V6iRkO7Nf1q6icMLUHBfMhJiWQbS
141+
7knFNSfCJ59Zb7girQixJLvMELHn6rgVg1nbRiUChBCxGul9NU/Gq5Xk0GzP4CiM
142+
mKFwd3DZeai3Tsod9txu/3nmJA6Cl40hXTXc2gNSceBCsNz6WBTpp5QHOBntV516
143+
ObtN2GUAyuk5XqiCTwGXCL/Sn6QyEEkTdhaTg2f//HxPWRR9Wy5juXQxblmJUa3y
144+
MUTQ255OW0a8mQa/Lg015SwXhDrPsgkh/5qVz/J79rCi0ej9Bkh17+0V0EctML50
145+
R1y94JPn+KQ7IbzItahz0j8zmtbDcpAwkdmOlQIDAQABAoIBAFsL8XdQpGecLIKD
146+
CNvIX/ul6+7usBvgEKy+2IY7+IyU9nzhESr7D6MeP0OJdvtLEYth1TckaSQul8pd
147+
A8xTTvwM2XHSZYGY24CmrcVpiVyNVAIFjwn7F+f8vNEP2amEqh4DP+kkEq5HDcWA
148+
N2PnZdTNyosni6vY6MC0Gq58Tg0Nf6Wewru1upd/wz6xOshRtlIxoLvrmDXqHuA1
149+
QdUmCmMcrvlIvHwvfusgLxzih+rBbXdHTkTUdwElvuHr3AXLv5ZY/F7hi7nv8J6X
150+
NekGhH8uQ+U8BMzXJSS5pupvvrGpaWQlERAj4XZ1XHaN/iXyxv+x+v+Avglg6StM
151+
hxTqWQECgYEA4j/d+ACh+NyiAGED6i8Lt4I68nUf5AMCIKzFW7oyzeXc5BZmC0da
152+
DP6xLrgj5B4YkrWCV52k9e8nQaslG1W8238y61xD1cbQ0YvtB43OgMsyyiD/LNu/
153+
Z86Hz/5nfslDPhF+KzLzF0L0RZJ6mKKriyphn+oqNzqFItFFHYcrza0CgYEAyx1t
154+
vwP8Q5GGC7NdcT7rW85BSnTYxMPshUORQbo6KABwSp3hHImoPUOqiWAPoizBLWDM
155+
/GKu2+2JmD4wTz5sShEeyIiNulmyXicJB8YsF+6bz/93l0mOLkuKF9VgDyk1ocFt
156+
WIEe5wtdURodJx4ky4q28Rl3ZmUh+zrJq3XAEYkCgYBN1Y71TLJsPOr2mmmQXRL4
157+
1LKWyrhn5qkKuKVEwy/LKbLuPM5qPue55Lzrx6mBRuFJR2xJ3A/uE5I7wzcGyl4o
158+
XQAVfC5SEw2vqSWoHZ7XLBCS/PsMYaTdf221nl3YfkDFz5rKHcMHU59Zd+T5Ma02
159+
OSRQsWxIh7dZnQjb+a6WGQKBgFeiVtt3aLvuaZtaxBI8R2fQ0bLCP1SGA+JriJyH
160+
MNhZeBl5jMq3SfNE4qtq2tPp418kyMyL903Eav1Yt5c5I5fBUzrKT/v6/05IIUlN
161+
Y3Df7jIL0xlfDw1CYk5uLYfdC9rCjd8FtsOQz65SSgm6o71+F/hmOHHhaIvwjVqA
162+
72GhAoGAO1FaFhO6h+2tKX7kBDBee5JRqbbtb7yZQyDFRW0iyR9SJEmkMo/K/vAZ
163+
yRlRnuZkz8QRnRJyKI+YRTeQdLVjGnDGBHwJIxDolqgOGqI4RiuNVrjNEnnReptT
164+
56sJylfJpR/5/xWF5O/I+RNJ2q/uirkeprWcWOPOqVMZV4hLJcU=
165+
-----END RSA PRIVATE KEY-----`
166+
129167
////////////////////////////////////////////////////////////////////////////////
130168
//
131169
// TLS certificate

0 commit comments

Comments
 (0)