Skip to content

Commit ec4a9b2

Browse files
ScruffyProdigygopherbot
authored andcommitted
google/internal/externalaccount: Adding metadata verification
Change-Id: I4d664862b7b287131c1481b238ebd0875f7c233b GitHub-Last-Rev: 74bcc33 GitHub-Pull-Request: #608 Reviewed-on: https://go-review.googlesource.com/c/oauth2/+/449975 Run-TryBot: Cody Oss <codyoss@google.com> Auto-Submit: Cody Oss <codyoss@google.com> Reviewed-by: Leo Siracusa <leosiracusa@google.com> Reviewed-by: Cody Oss <codyoss@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
1 parent 68a41d6 commit ec4a9b2

File tree

3 files changed

+286
-28
lines changed

3 files changed

+286
-28
lines changed

google/internal/externalaccount/aws.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,49 @@ type awsRequest struct {
267267
Headers []awsRequestHeader `json:"headers"`
268268
}
269269

270+
func (cs awsCredentialSource) validateMetadataServers() error {
271+
if err := cs.validateMetadataServer(cs.RegionURL, "region_url"); err != nil {
272+
return err
273+
}
274+
if err := cs.validateMetadataServer(cs.CredVerificationURL, "url"); err != nil {
275+
return err
276+
}
277+
return cs.validateMetadataServer(cs.IMDSv2SessionTokenURL, "imdsv2_session_token_url")
278+
}
279+
280+
var validHostnames []string = []string{"169.254.169.254", "fd00:ec2::254"}
281+
282+
func (cs awsCredentialSource) isValidMetadataServer(metadataUrl string) bool {
283+
if metadataUrl == "" {
284+
// Zero value means use default, which is valid.
285+
return true
286+
}
287+
288+
u, err := url.Parse(metadataUrl)
289+
if err != nil {
290+
// Unparseable URL means invalid
291+
return false
292+
}
293+
294+
for _, validHostname := range validHostnames {
295+
if u.Hostname() == validHostname {
296+
// If it's one of the valid hostnames, everything is good
297+
return true
298+
}
299+
}
300+
301+
// hostname not found in our allowlist, so not valid
302+
return false
303+
}
304+
305+
func (cs awsCredentialSource) validateMetadataServer(metadataUrl, urlName string) error {
306+
if !cs.isValidMetadataServer(metadataUrl) {
307+
return fmt.Errorf("oauth2/google: invalid hostname %s for %s", metadataUrl, urlName)
308+
}
309+
310+
return nil
311+
}
312+
270313
func (cs awsCredentialSource) doRequest(req *http.Request) (*http.Response, error) {
271314
if cs.client == nil {
272315
cs.client = oauth2.NewClient(cs.ctx, nil)

0 commit comments

Comments
 (0)