mirror of
https://github.com/minio/minio.git
synced 2025-01-11 15:03:22 -05:00
security: Remove insecure custom headers (#10244)
Background: https://github.com/google/security-research/security/advisories/GHSA-76wf-9vgp-pj7w Remove these custom headers from incoming and outgoing requests.
This commit is contained in:
parent
9179cdfc9d
commit
f8f290e848
@ -128,6 +128,11 @@ func setObjectHeaders(w http.ResponseWriter, objInfo ObjectInfo, rs *HTTPRangeSp
|
|||||||
// values to client.
|
// values to client.
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/google/security-research/security/advisories/GHSA-76wf-9vgp-pj7w
|
||||||
|
if strings.EqualFold(k, xhttp.AmzMetaUnencryptedContentLength) || strings.EqualFold(k, xhttp.AmzMetaUnencryptedContentMD5) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
var isSet bool
|
var isSet bool
|
||||||
for _, userMetadataPrefix := range userMetadataKeyPrefixes {
|
for _, userMetadataPrefix := range userMetadataKeyPrefixes {
|
||||||
if !strings.HasPrefix(k, userMetadataPrefix) {
|
if !strings.HasPrefix(k, userMetadataPrefix) {
|
||||||
|
@ -564,6 +564,10 @@ func generateListObjectsV2Response(bucket, prefix, token, nextToken, startAfter,
|
|||||||
// values to client.
|
// values to client.
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// https://github.com/google/security-research/security/advisories/GHSA-76wf-9vgp-pj7w
|
||||||
|
if strings.EqualFold(k, xhttp.AmzMetaUnencryptedContentLength) || strings.EqualFold(k, xhttp.AmzMetaUnencryptedContentMD5) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
content.UserMetadata[k] = v
|
content.UserMetadata[k] = v
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,8 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
xhttp "github.com/minio/minio/cmd/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SSEHeader is the general AWS SSE HTTP header key.
|
// SSEHeader is the general AWS SSE HTTP header key.
|
||||||
@ -81,6 +83,8 @@ const (
|
|||||||
func RemoveSensitiveHeaders(h http.Header) {
|
func RemoveSensitiveHeaders(h http.Header) {
|
||||||
h.Del(SSECKey)
|
h.Del(SSECKey)
|
||||||
h.Del(SSECopyKey)
|
h.Del(SSECopyKey)
|
||||||
|
h.Del(xhttp.AmzMetaUnencryptedContentLength)
|
||||||
|
h.Del(xhttp.AmzMetaUnencryptedContentMD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRequested returns true if the HTTP headers indicates
|
// IsRequested returns true if the HTTP headers indicates
|
||||||
|
@ -457,6 +457,16 @@ var removeSensitiveHeadersTests = []struct {
|
|||||||
"X-Amz-Meta-Test-1": []string{"Test-1"},
|
"X-Amz-Meta-Test-1": []string{"Test-1"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{ // https://github.com/google/security-research/security/advisories/GHSA-76wf-9vgp-pj7w
|
||||||
|
Header: http.Header{
|
||||||
|
"X-Amz-Meta-X-Amz-Unencrypted-Content-Md5": []string{"value"},
|
||||||
|
"X-Amz-Meta-X-Amz-Unencrypted-Content-Length": []string{"value"},
|
||||||
|
"X-Amz-Meta-Test-1": []string{"Test-1"},
|
||||||
|
},
|
||||||
|
ExpectedHeader: http.Header{
|
||||||
|
"X-Amz-Meta-Test-1": []string{"Test-1"},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRemoveSensitiveHeaders(t *testing.T) {
|
func TestRemoveSensitiveHeaders(t *testing.T) {
|
||||||
|
@ -19,6 +19,7 @@ import (
|
|||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
|
xhttp "github.com/minio/minio/cmd/http"
|
||||||
"github.com/minio/minio/cmd/logger"
|
"github.com/minio/minio/cmd/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -38,6 +39,8 @@ func IsMultiPart(metadata map[string]string) bool {
|
|||||||
func RemoveSensitiveEntries(metadata map[string]string) { // The functions is tested in TestRemoveSensitiveHeaders for compatibility reasons
|
func RemoveSensitiveEntries(metadata map[string]string) { // The functions is tested in TestRemoveSensitiveHeaders for compatibility reasons
|
||||||
delete(metadata, SSECKey)
|
delete(metadata, SSECKey)
|
||||||
delete(metadata, SSECopyKey)
|
delete(metadata, SSECopyKey)
|
||||||
|
delete(metadata, xhttp.AmzMetaUnencryptedContentLength)
|
||||||
|
delete(metadata, xhttp.AmzMetaUnencryptedContentMD5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveSSEHeaders removes all crypto-specific SSE
|
// RemoveSSEHeaders removes all crypto-specific SSE
|
||||||
|
@ -131,6 +131,13 @@ func extractMetadata(ctx context.Context, r *http.Request) (metadata map[string]
|
|||||||
metadata[strings.ToLower(xhttp.ContentType)] = "application/octet-stream"
|
metadata[strings.ToLower(xhttp.ContentType)] = "application/octet-stream"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/google/security-research/security/advisories/GHSA-76wf-9vgp-pj7w
|
||||||
|
for k := range metadata {
|
||||||
|
if strings.EqualFold(k, xhttp.AmzMetaUnencryptedContentLength) || strings.EqualFold(k, xhttp.AmzMetaUnencryptedContentMD5) {
|
||||||
|
delete(metadata, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if contentEncoding, ok := metadata[strings.ToLower(xhttp.ContentEncoding)]; ok {
|
if contentEncoding, ok := metadata[strings.ToLower(xhttp.ContentEncoding)]; ok {
|
||||||
contentEncoding = trimAwsChunkedContentEncoding(contentEncoding)
|
contentEncoding = trimAwsChunkedContentEncoding(contentEncoding)
|
||||||
if contentEncoding != "" {
|
if contentEncoding != "" {
|
||||||
|
@ -102,6 +102,9 @@ const (
|
|||||||
AmzSecurityToken = "X-Amz-Security-Token"
|
AmzSecurityToken = "X-Amz-Security-Token"
|
||||||
AmzDecodedContentLength = "X-Amz-Decoded-Content-Length"
|
AmzDecodedContentLength = "X-Amz-Decoded-Content-Length"
|
||||||
|
|
||||||
|
AmzMetaUnencryptedContentLength = "X-Amz-Meta-X-Amz-Unencrypted-Content-Length"
|
||||||
|
AmzMetaUnencryptedContentMD5 = "X-Amz-Meta-X-Amz-Unencrypted-Content-Md5"
|
||||||
|
|
||||||
// Signature v2 related constants
|
// Signature v2 related constants
|
||||||
AmzSignatureV2 = "Signature"
|
AmzSignatureV2 = "Signature"
|
||||||
AmzAccessKeyID = "AWSAccessKeyId"
|
AmzAccessKeyID = "AWSAccessKeyId"
|
||||||
|
@ -24,6 +24,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
xhttp "github.com/minio/minio/cmd/http"
|
||||||
"github.com/minio/minio/cmd/logger"
|
"github.com/minio/minio/cmd/logger"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -397,6 +398,11 @@ func (j xlMetaV2Object) ToFileInfo(volume, path string) (FileInfo, error) {
|
|||||||
}
|
}
|
||||||
fi.Metadata = make(map[string]string, len(j.MetaUser)+len(j.MetaSys))
|
fi.Metadata = make(map[string]string, len(j.MetaUser)+len(j.MetaSys))
|
||||||
for k, v := range j.MetaUser {
|
for k, v := range j.MetaUser {
|
||||||
|
// https://github.com/google/security-research/security/advisories/GHSA-76wf-9vgp-pj7w
|
||||||
|
if strings.EqualFold(k, xhttp.AmzMetaUnencryptedContentLength) || strings.EqualFold(k, xhttp.AmzMetaUnencryptedContentMD5) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
fi.Metadata[k] = v
|
fi.Metadata[k] = v
|
||||||
}
|
}
|
||||||
for k, v := range j.MetaSys {
|
for k, v := range j.MetaSys {
|
||||||
|
Loading…
Reference in New Issue
Block a user