説明
エントリ名とリンク先を検証せずに os.Symlink でアーカイブ内のリンクを作成すると、展開ディレクトリの外を指すリンクが作られるおそれがあります。
想定される影響
- 後続の展開処理がリンクをたどり、展開先の外のファイルを上書きする可能性があります。
- 設定ファイルや実行ファイルの改ざんにつながるおそれがあります。
対処方法
- シンボリックリンクのエントリは原則として拒否し、必要な場合も明示的に許可したものだけに限定してください。
- リンク名とリンク先の両方が展開ルート内に収まることを検証してください。
例
変更前
go
target := filepath.Join(dest, hdr.Name)
_ = os.Symlink(hdr.Linkname, target)
変更後
go
package example
import (
"archive/tar"
"fmt"
)
func rejectArchiveLinks(hdr *tar.Header) error {
switch hdr.Typeflag {
case tar.TypeSymlink, tar.TypeLink:
return fmt.Errorf("archive links are not allowed: %q", hdr.Name)
}
return nil
}
説明:
- 変更前: エントリ名やリンク先を検証しないと、既存のリンクや
..を含むパスを利用し、展開ルートの外を指すリンクを作られるおそれがあります。 - 変更後: シンボリックリンクとハードリンクのエントリを明示的に拒否します。
filepath.Base(hdr.Linkname)だけでは、リンク先の..がそのまま残るため不十分です。