Skip to content

Commit 74bcc33

Browse files
google/internal/external: Adding metadata verification
1 parent 68a41d6 commit 74bcc33

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)