Skip to content

Commit 0d6112d

Browse files
committed
firewall: obfuscate ConnectPeer
Also adds a privacy flag that controls obfuscation of network addresses.
1 parent b89e89e commit 0d6112d

File tree

4 files changed

+102
-9
lines changed

4 files changed

+102
-9
lines changed

firewall/privacy_mapper.go

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,11 @@ func (p *PrivacyMapper) checkers(db firewalldb.PrivacyMapDB,
303303
handleBatchOpenChannelResponse(db, flags, p.randIntn),
304304
mid.PassThroughErrorHandler,
305305
),
306+
"/lnrpc.Lightning/ConnectPeer": mid.NewRequestRewriter(
307+
&lnrpc.ConnectPeerRequest{},
308+
&lnrpc.ConnectPeerResponse{},
309+
handleConnectPeerRequest(db, flags),
310+
),
306311
}
307312
}
308313

@@ -1173,7 +1178,7 @@ func handleBatchOpenChannelRequest(db firewalldb.PrivacyMapDB,
11731178

11741179
func handleBatchOpenChannelResponse(db firewalldb.PrivacyMapDB,
11751180
flags session.PrivacyFlags,
1176-
randIntn func(int) (int, error)) func(ctx context.Context,
1181+
_ func(int) (int, error)) func(ctx context.Context,
11771182
r *lnrpc.BatchOpenChannelResponse) (proto.Message, error) {
11781183

11791184
return func(_ context.Context, r *lnrpc.BatchOpenChannelResponse) (
@@ -1222,6 +1227,46 @@ func handleBatchOpenChannelResponse(db firewalldb.PrivacyMapDB,
12221227
}
12231228
}
12241229

1230+
func handleConnectPeerRequest(db firewalldb.PrivacyMapDB,
1231+
flags session.PrivacyFlags) func(ctx context.Context,
1232+
r *lnrpc.ConnectPeerRequest) (proto.Message, error) {
1233+
1234+
return func(_ context.Context, r *lnrpc.ConnectPeerRequest) (
1235+
proto.Message, error) {
1236+
1237+
err := db.View(func(tx firewalldb.PrivacyMapTx) error {
1238+
var err error
1239+
// Note, this only works if the pubkey alias was
1240+
// already created via other calls, e.g. via
1241+
// ListChannels or GetNodeInfo.
1242+
if !flags.Contains(session.ClearPubkeys) {
1243+
r.Addr.Pubkey, err = firewalldb.RevealString(
1244+
tx, r.Addr.Pubkey,
1245+
)
1246+
if err != nil {
1247+
return err
1248+
}
1249+
}
1250+
1251+
if !flags.Contains(session.ClearNetworkAddresses) {
1252+
r.Addr.Host, err = firewalldb.RevealString(
1253+
tx, r.Addr.Host,
1254+
)
1255+
if err != nil {
1256+
return err
1257+
}
1258+
}
1259+
1260+
return nil
1261+
})
1262+
if err != nil {
1263+
return nil, err
1264+
}
1265+
1266+
return r, nil
1267+
}
1268+
}
1269+
12251270
// maybeHideAmount hides an amount if the privacy flag is not set.
12261271
func maybeHideAmount(flags session.PrivacyFlags, randIntn func(int) (int, error),
12271272
a int64) (int64, error) {

firewall/privacy_mapper_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ func TestPrivacyMapper(t *testing.T) {
5252
outPoint(clearTxID, 0): outPoint(obfusTxID0, obfusOut0),
5353
outPoint(clearTxID, 1): outPoint(obfusTxID1, obfusOut1),
5454
"01020304": "c8134495",
55+
"secret-host.com": "sksiuekalkdoowurekdf",
5556
}
5657

5758
var (
@@ -527,6 +528,43 @@ func TestPrivacyMapper(t *testing.T) {
527528
},
528529
},
529530
},
531+
{
532+
name: "ConnectPeer Request",
533+
uri: "/lnrpc.Lightning/ConnectPeer",
534+
msgType: rpcperms.TypeRequest,
535+
msg: &lnrpc.ConnectPeerRequest{
536+
Addr: &lnrpc.LightningAddress{
537+
Pubkey: "c8134495",
538+
Host: "sksiuekalkdoowurekdf",
539+
},
540+
},
541+
expectedReplacement: &lnrpc.ConnectPeerRequest{
542+
Addr: &lnrpc.LightningAddress{
543+
Pubkey: "01020304",
544+
Host: "secret-host.com",
545+
},
546+
},
547+
},
548+
{
549+
name: "ConnectPeer Request clear pubkey",
550+
uri: "/lnrpc.Lightning/ConnectPeer",
551+
msgType: rpcperms.TypeRequest,
552+
msg: &lnrpc.ConnectPeerRequest{
553+
Addr: &lnrpc.LightningAddress{
554+
Pubkey: "c8134495",
555+
Host: "sksiuekalkdoowurekdf",
556+
},
557+
},
558+
privacyFlags: []session.PrivacyFlag{
559+
session.ClearPubkeys,
560+
},
561+
expectedReplacement: &lnrpc.ConnectPeerRequest{
562+
Addr: &lnrpc.LightningAddress{
563+
Pubkey: "c8134495",
564+
Host: "secret-host.com",
565+
},
566+
},
567+
},
530568
}
531569

532570
decodedID := &lnrpc.MacaroonId{

session/privacy_flags.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,22 @@ const (
4949
// ClearClosingTxIds is a privacy flag that indicates that the channel
5050
// closing transaction ids in the API should not be obfuscated.
5151
ClearClosingTxIds PrivacyFlag = 7
52+
53+
// ClearNetworkAddresses is a privacy flag that indicates that the
54+
// network addresses in the API should not be obfuscated.
55+
ClearNetworkAddresses PrivacyFlag = 8
5256
)
5357

5458
var flagMap = map[PrivacyFlag]string{
55-
ClearPubkeys: "ClearPubkeys",
56-
ClearAmounts: "ClearAmounts",
57-
ClearChanIDs: "ClearChanIDs",
58-
ClearTimeStamps: "ClearTimeStamps",
59-
ClearChanInitiator: "ClearChanInitiator",
60-
ClearHTLCs: "ClearHTLCs",
61-
ClearAccountBalances: "ClearAccountBalances",
62-
ClearClosingTxIds: "ClearClosingTxIds",
59+
ClearPubkeys: "ClearPubkeys",
60+
ClearAmounts: "ClearAmounts",
61+
ClearChanIDs: "ClearChanIDs",
62+
ClearTimeStamps: "ClearTimeStamps",
63+
ClearChanInitiator: "ClearChanInitiator",
64+
ClearHTLCs: "ClearHTLCs",
65+
ClearAccountBalances: "ClearAccountBalances",
66+
ClearClosingTxIds: "ClearClosingTxIds",
67+
ClearNetworkAddresses: "ClearNetworkAddresses",
6368
}
6469

6570
// String returns a string representation of the privacy flag.

session/privacy_flags_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,9 @@ func TestPrivacyFlags(t *testing.T) {
5656
require.True(t, flags.Contains(ClearPubkeys))
5757
require.True(t, flags.Contains(ClearAmounts))
5858
require.False(t, flags.Contains(ClearChanIDs))
59+
60+
autoOpenFlags := PrivacyFlags{ClearPubkeys, ClearNetworkAddresses}
61+
require.NoError(t, err)
62+
require.Equal(t, "ClearPubkeys|ClearNetworkAddresses",
63+
autoOpenFlags.String())
5964
}

0 commit comments

Comments
 (0)