Don't add padding unless the query has padding

Or else Firefox craps out
This commit is contained in:
Frank Denis 2020-01-31 11:17:36 +01:00
parent 70311614a0
commit 2dda74647d
2 changed files with 31 additions and 4 deletions

View file

@ -209,6 +209,21 @@ func updateTTL(msg *dns.Msg, expiration time.Time) {
} }
} }
func hasEDNS0Padding(packet []byte) (bool, error) {
msg := dns.Msg{}
if err := msg.Unpack(packet); err != nil {
return false, err
}
if edns0 := msg.IsEdns0(); edns0 != nil {
for _, option := range edns0.Option {
if option.Option() == dns.EDNS0PADDING {
return true, nil
}
}
}
return false, nil
}
func addEDNS0PaddingIfNoneFound(msg *dns.Msg, unpaddedPacket []byte, paddingLen int) ([]byte, error) { func addEDNS0PaddingIfNoneFound(msg *dns.Msg, unpaddedPacket []byte, paddingLen int) ([]byte, error) {
edns0 := msg.IsEdns0() edns0 := msg.IsEdns0()
if edns0 == nil { if edns0 == nil {

View file

@ -6,6 +6,7 @@ import (
"io/ioutil" "io/ioutil"
"net" "net"
"net/http" "net/http"
"strings"
"time" "time"
"github.com/jedisct1/dlog" "github.com/jedisct1/dlog"
@ -47,6 +48,11 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
dlog.Warnf("No body in a local DoH query") dlog.Warnf("No body in a local DoH query")
return return
} }
hasEDNS0Padding, err := hasEDNS0Padding(packet)
if err != nil {
writer.WriteHeader(400)
return
}
response := proxy.processIncomingQuery(proxy.serversInfo.getOne(), "local_doh", proxy.mainProto, packet, &xClientAddr, nil, start) response := proxy.processIncomingQuery(proxy.serversInfo.getOne(), "local_doh", proxy.mainProto, packet, &xClientAddr, nil, start)
if len(response) == 0 { if len(response) == 0 {
writer.WriteHeader(500) writer.WriteHeader(500)
@ -60,13 +66,19 @@ func (handler localDoHHandler) ServeHTTP(writer http.ResponseWriter, request *ht
responseLen := len(response) responseLen := len(response)
paddedLen := dohPaddedLen(responseLen) paddedLen := dohPaddedLen(responseLen)
padLen := paddedLen - responseLen padLen := paddedLen - responseLen
paddedResponse, err := addEDNS0PaddingIfNoneFound(&msg, response, padLen) if hasEDNS0Padding {
if err != nil { response, err = addEDNS0PaddingIfNoneFound(&msg, response, padLen)
return if err != nil {
dlog.Critical(err)
return
}
} else {
pad := strings.Repeat("X", padLen)
writer.Header().Set("X-Pad", pad)
} }
writer.Header().Set("Content-Type", dataType) writer.Header().Set("Content-Type", dataType)
writer.WriteHeader(200) writer.WriteHeader(200)
writer.Write(paddedResponse) writer.Write(response)
} }
func (proxy *Proxy) localDoHListener(acceptPc *net.TCPListener) { func (proxy *Proxy) localDoHListener(acceptPc *net.TCPListener) {