説明
ユーザー入力の改行を無害化せずにログへ記録すると、攻撃者が偽のログ行を挿入したり、ログ分析を妨げたりするおそれがあります。
想定される影響
- インシデントの検知や調査が難しくなる可能性があります。
- 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 ログビューアーでは出力先の文脈に応じた処理が引き続き必要です。