mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-08-06 19:08:41 +02:00
76 lines
2.2 KiB
Go
76 lines
2.2 KiB
Go
package c2
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func TestManagerSaveResultBlobConfinesPath(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
mgr := NewManager(nil, zap.NewNop(), filepath.Join(tmp, "c2store"))
|
|
content := base64.StdEncoding.EncodeToString([]byte("result bytes"))
|
|
|
|
got, err := mgr.saveResultBlob("t_safe123", content, "txt")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
want := filepath.Join(tmp, "c2store", "results", "t_safe123.txt")
|
|
if got != want {
|
|
t.Fatalf("path=%q want %q", got, want)
|
|
}
|
|
raw, err := os.ReadFile(want)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if string(raw) != "result bytes" {
|
|
t.Fatalf("content=%q", raw)
|
|
}
|
|
|
|
outside := filepath.Join(tmp, "owned")
|
|
if _, err := mgr.saveResultBlob("t_safe123", content, "./../../owned"); err == nil {
|
|
t.Fatal("expected traversal suffix to be rejected")
|
|
}
|
|
if _, err := os.Stat(outside); !os.IsNotExist(err) {
|
|
t.Fatalf("outside file exists or stat failed unexpectedly: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestUploadPathForTaskConfinesPath(t *testing.T) {
|
|
tmp := t.TempDir()
|
|
store := filepath.Join(tmp, "c2store")
|
|
|
|
dir, got, err := uploadPathForTask(store, "t_safe123")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if want := filepath.Join(store, "uploads"); dir != want {
|
|
t.Fatalf("dir=%q want %q", dir, want)
|
|
}
|
|
if want := filepath.Join(store, "uploads", "t_safe123.bin"); got != want {
|
|
t.Fatalf("path=%q want %q", got, want)
|
|
}
|
|
|
|
for _, taskID := range []string{"", ".", "..", "../owned", `..\owned`, "sub/owned", "sub\\owned", "task.with.dot", "-leading"} {
|
|
if _, _, err := uploadPathForTask(store, taskID); err == nil {
|
|
t.Fatalf("task_id %q unexpectedly accepted", taskID)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestNormalizeResultBlobSuffix(t *testing.T) {
|
|
for _, suffix := range []string{"", "png", ".jpg", ".7z", ".safe_name-1"} {
|
|
if _, err := normalizeResultBlobSuffix(suffix); err != nil {
|
|
t.Fatalf("suffix %q rejected: %v", suffix, err)
|
|
}
|
|
}
|
|
for _, suffix := range []string{".", "..", "../x", "./../../x", "/tmp/x", `..\x`, ".name.with.dot", ".toolong012345678901234567890123456789"} {
|
|
if _, err := normalizeResultBlobSuffix(suffix); err == nil {
|
|
t.Fatalf("suffix %q unexpectedly accepted", suffix)
|
|
}
|
|
}
|
|
}
|