これは旧eviry tech blogから移行した記事です。
どんなバグ?
- 非常に些末なバグ
aws-sdk-go
で~/.aws/credentials
にaws_secret_access_key = /\d{40}/
が存在するとsession.NewSession()
でこけるprofile
として明示的にしなくても、上記エントリが存在するだけで~/.aws/credentials
解析後に必ずこける
再現方法
確認した
- まず発見してからAWSサポートの方へ以下を相談/確認した
aws_secret_access_key
の文字列パターンに/\d{40}/
はありえるかgit-secrets
を例にあり得るのではないか、という回答
- サポートの方へお礼を言って、直す意味がありそうだったら直してみようかとコードを追いはじめる
コードを追った
src/github.com/aws/aws-sdk-go/internal/ini/walker.go
- アクセスキーは
20文字
- シークレットキーは
40文字
- オール
1
を数値
として判定しているように見える挙動 - 21桁以上で
value out of range
: こっちが腑に落ちない - 20桁以下で
SharedCredsLoad: failed to get profile
: こちらは挙動としてはまだ正しそう - そもそも
IntergerType
として扱われてしまう v, err := newValue(rhs.Root.ValueType, rhs.Root.base, rhs.Root.Raw())
のrhs.Root.ValueType
がIntergerType
と判断されてるってことsrc/github.com/aws/aws-sdk-go/internal/ini/literal_tokens.go
newLitToken(b [rune]) (Token, int, error)
にはいってIntergerType
とみなされる
- オール
- アクセスキーは
src/github.com/aws/aws-sdk-go/internal/ini/visitor.go
func (v *DefaultVisitor) VisitExpr(expr AST) error
- ここでピンポイントに直せそう
Issue / PRまでだした
結論としては以下の形
- 「マジックバリューになってるからよくないよ」
- 「というか、これは
aws_secret_access_key
に限定しないで対応したほうがよさそうだね」 - internal/ini: ensure that numbers that are too large be converted into string types by xibz · Pull Request #2255 · aws/aws-sdk-go
感想
- 面白いバグを見つけられてよかった
- こんどはちゃんとmergeされたい
ところで
なんでこんなバグをみつけたのか
dynamodb-local
を利用していて、dummyの aws profile を設定していた
そのとき
~/.aws/credentials
を以下で設定していたので発見した[dynamodb-local] aws_access_key_id = AKIA0000000000000000 aws_secret_access_key = 1111111111111111111111111111111111111111