@@ -10,6 +10,7 @@ import (
10
10
"fmt"
11
11
"net/http"
12
12
"net/http/httputil"
13
+ "net/textproto"
13
14
"strings"
14
15
"time"
15
16
@@ -18,6 +19,7 @@ import (
18
19
"github.com/gorilla/handlers"
19
20
"github.com/gorilla/mux"
20
21
"github.com/pkg/errors"
22
+ "golang.org/x/net/http/httpguts"
21
23
"k8s.io/apimachinery/pkg/labels"
22
24
"k8s.io/apimachinery/pkg/util/sets"
23
25
"k8s.io/apiserver/pkg/authentication/serviceaccount"
@@ -178,6 +180,9 @@ func (n kubeFilter) impersonateHandler(writer http.ResponseWriter, request *http
178
180
if len (n .bearerToken ) > 0 {
179
181
request .Header .Set ("Authorization" , fmt .Sprintf ("Bearer %s" , n .bearerToken ))
180
182
}
183
+ // Dropping malicious header connection
184
+ // https://github.com/clastix/capsule-proxy/issues/188
185
+ n .removingHopByHopHeaders (request )
181
186
182
187
request .Header .Add ("Impersonate-User" , username )
183
188
@@ -355,3 +360,28 @@ func (n kubeFilter) getProxyTenantsForOwnerKind(ownerKind capsulev1beta1.OwnerKi
355
360
356
361
return
357
362
}
363
+
364
+ func (n * kubeFilter ) removingHopByHopHeaders (request * http.Request ) {
365
+ connectionHeaderName , upgradeHeaderName , requestUpgradeType := "connection" , "upgrade" , ""
366
+
367
+ if httpguts .HeaderValuesContainsToken (request .Header [connectionHeaderName ], upgradeHeaderName ) {
368
+ requestUpgradeType = request .Header .Get (upgradeHeaderName )
369
+ }
370
+ // Removing connection headers
371
+ for _ , f := range request .Header .Values (connectionHeaderName ) {
372
+ for _ , sf := range strings .Split (f , "," ) {
373
+ if sf = textproto .TrimString (sf ); sf != "" {
374
+ request .Header .Del (sf )
375
+ }
376
+ }
377
+ }
378
+
379
+ if requestUpgradeType != "" {
380
+ request .Header .Set (connectionHeaderName , upgradeHeaderName )
381
+ request .Header .Set (upgradeHeaderName , requestUpgradeType )
382
+
383
+ return
384
+ }
385
+
386
+ request .Header .Del (connectionHeaderName )
387
+ }
0 commit comments