ログインジェクション

ログインジェクション

説明

ユーザー入力の改行を無害化せずにログへ記録すると、攻撃者が偽のログ行を挿入したり、ログ分析を妨げたりするおそれがあります。

想定される影響

  • インシデントの検知や調査が難しくなる可能性があります。
  • HTML ログビューアーが入力を HTML として解釈すると、XSS につながるおそれがあります。

対処方法

  • 記録前に \r と \n を除去するか、ログ形式に合わせて入力をエンコードしてください。
  • 生のユーザー入力ではなく、正規化した値や識別子を記録してください。

例

変更前

go
user := r.FormValue("user")
log.Printf("user=%s", user)

変更後

go
user := strings.ReplaceAll(r.FormValue("user"), "\n", "")
user = strings.ReplaceAll(user, "\r", "")
log.Printf("user=%s", user)

説明:

  • 変更前: 改行を無害化せずに入力を記録すると、偽のログ行を挿入されるおそれがあります。未エンコードの入力を HTML として解釈するビューアーには、別のリスクも生じます。
  • 変更後: \r と \n を除去して行単位の偽装を減らします。HTML エンコードは行わないため、Web ログビューアーでは出力先の文脈に応じた処理が引き続き必要です。

参考資料