@@ -267,6 +267,49 @@ type awsRequest struct {
267267Headers []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+
270313func (cs awsCredentialSource ) doRequest (req * http.Request ) (* http.Response , error ) {
271314if cs .client == nil {
272315cs .client = oauth2 .NewClient (cs .ctx , nil )
0 commit comments