mirror of
https://github.com/J3vb/OwnCord.git
synced 2026-09-03 03:50:00 +03:00
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package plugin
|
|||
|
|
|
||
|
|
import (
|
||
|
|
"strings"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
// FuzzValidateRelativePath asserts that whenever validateRelativePath
|
||
|
|
// accepts a path (returns nil), that path is genuinely contained under the
|
||
|
|
// plugin base directory: not absolute, not empty, containing no ".."
|
||
|
|
// traversal component (checked as a real path segment, not just a
|
||
|
|
// substring, so a segment like "..foo" or "foo.." can't false-positive),
|
||
|
|
// no NUL byte, no backslash, and no leading separator.
|
||
|
|
func FuzzValidateRelativePath(f *testing.F) {
|
||
|
|
seeds := []string{
|
||
|
|
"",
|
||
|
|
".",
|
||
|
|
"..",
|
||
|
|
"/",
|
||
|
|
"/etc/passwd",
|
||
|
|
"a/b/c.js",
|
||
|
|
"../secret",
|
||
|
|
"a/../../secret",
|
||
|
|
"a/../b",
|
||
|
|
"./a",
|
||
|
|
"a//b",
|
||
|
|
"a/",
|
||
|
|
"a/b/",
|
||
|
|
"\\windows\\evil",
|
||
|
|
"a\\b",
|
||
|
|
"a\x00b",
|
||
|
|
"..a",
|
||
|
|
"a..",
|
||
|
|
"a..b",
|
||
|
|
"foo/..bar",
|
||
|
|
"C:\\evil.dll",
|
||
|
|
strings.Repeat("a/", 100) + "x.js",
|
||
|
|
"a/./b",
|
||
|
|
"a/../b/../c",
|
||
|
|
}
|
||
|
|
for _, s := range seeds {
|
||
|
|
f.Add(s)
|
||
|
|
}
|
||
|
|
|
||
|
|
f.Fuzz(func(t *testing.T, p string) {
|
||
|
|
err := validateRelativePath(p)
|
||
|
|
if err != nil {
|
||
|
|
return
|
||
|
|
}
|
||
|
|
|
||
|
|
// Accepted: verify genuine containment under the plugin base dir.
|
||
|
|
if p == "" {
|
||
|
|
t.Fatalf("validateRelativePath(%q) = nil but path is empty", p)
|
||
|
|
}
|
||
|
|
if strings.ContainsRune(p, 0) {
|
||
|
|
t.Fatalf("validateRelativePath(%q) = nil but path contains a NUL byte", p)
|
||
|
|
}
|
||
|
|
if strings.ContainsRune(p, '\\') {
|
||
|
|
t.Fatalf("validateRelativePath(%q) = nil but path contains a backslash", p)
|
||
|
|
}
|
||
|
|
if strings.HasPrefix(p, "/") {
|
||
|
|
t.Fatalf("validateRelativePath(%q) = nil but path is absolute", p)
|
||
|
|
}
|
||
|
|
if p == "." {
|
||
|
|
t.Fatalf("validateRelativePath(%q) = nil but path is the current directory", p)
|
||
|
|
}
|
||
|
|
for seg := range strings.SplitSeq(p, "/") {
|
||
|
|
if seg == ".." {
|
||
|
|
t.Fatalf("validateRelativePath(%q) = nil but path contains a %q traversal segment", p, "..")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})
|
||
|
|
}
|