eviry tech & service blog

「株式会社エビリー」の社員ブログです。弊社では、クラウド型動画配信サービス「millvi」、ソーシャル動画データ及び分析サービス「kamui tracker」、YouTube総合メディア「かむなび」を開発・提供しています。https://eviry.com/

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

これは旧eviry tech blogから移行した記事です。

どんなバグ?

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

再現方法

確認した

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

ところで