2018/11/04 - 10:31

バグ報告をしてOSS貢献をする

:

:

:

どんなバグ?

  • 非常に些末なバグ
    • aws-sdk-go~/.aws/credentialsaws_secret_access_key = /\d{40}/が存在すると session.NewSession() でこける
    • profile として明示的にしなくても、上記エントリが存在するだけで ~/.aws/credentials 解析後に必ずこける

再現方法

確認した

  • まず発見してからAWSサポートの方へ以下を相談/確認した
    • Q. aws_secret_access_key の文字列パターンに /\d{40}/ はありえるか
    • A. 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.ValueTypeIntergerType と判断されてるってこと
    • 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までだした

  • 結論としては以下の形

感想

  • 面白いバグを見つけられてよかった
  • こんどはちゃんとmergeされたい

ところで