123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- package main
- import (
- "fmt"
- "os"
- "os/exec"
- "strconv"
- "strings"
- "sync"
- "github.com/langgenius/dify-sandbox/internal/static/python_syscall"
- )
- const (
- SYSCALL_NUMS = 500
- )
- var (
- total_rans = 0
- total_rans_lock = sync.Mutex{}
- )
- func run(allowed_syscalls []int) error {
- total_rans_lock.Lock()
- total_rans++
- total_rans_lock.Unlock()
- nums := []string{}
- for _, syscall := range allowed_syscalls {
- nums = append(nums, strconv.Itoa(syscall))
- }
- os.Setenv("ALLOWED_SYSCALLS", strings.Join(nums, ","))
- cmd := exec.Command("python3", "cmd/test/fuzz_python_amd64/test.py")
- cmd.Stderr = os.Stderr
- _, err := cmd.Output()
- if err == nil {
- return nil
- } else {
- return err
- }
- }
- func find_syscall(syscall int, syscalls []int) int {
- for i, s := range syscalls {
- if s == syscall {
- return i
- }
- }
- return -1
- }
- func fuzz_range(r []int) bool {
- original := python_syscall.ALLOW_SYSCALLS
- original = append(original, python_syscall.ALLOW_NETWORK_SYSCALLS...)
- // generate task list
- list := make([][]int, 10)
- for i := 0; i < 10; i++ {
- list[i] = make([]int, len(original))
- copy(list[i], original)
- for _, j := range r {
- if find_syscall(j, list[i]) == -1 {
- list[i] = append(list[i], j)
- }
- }
- }
- lock := sync.Mutex{}
- wg := sync.WaitGroup{}
- i := 0
- // run 4 tasks concurrently
- failed := false
- for j := 0; j < 4; j++ {
- wg.Add(1)
- go func() {
- defer wg.Done()
- for {
- lock.Lock()
- if i >= len(list) {
- lock.Unlock()
- return
- }
- task := list[i]
- i++
- lock.Unlock()
- if run(task) != nil {
- failed = true
- // stop all tasks
- lock.Lock()
- i = len(list)
- lock.Unlock()
- }
- }
- }()
- }
- // wait for all tasks to finish
- wg.Wait()
- return !failed
- }
- func fuzz() {
- unnecessary_syscalls := []int{}
- for i := 0; i < SYSCALL_NUMS; i++ {
- // remove syscall
- fmt.Println(i)
- nr := []int{}
- for j := 0; j < SYSCALL_NUMS; j++ {
- // skip i and unnecessary syscalls
- if i != j && find_syscall(j, unnecessary_syscalls) == -1 &&
- find_syscall(j, python_syscall.ALLOW_SYSCALLS) == -1 &&
- find_syscall(j, python_syscall.ALLOW_NETWORK_SYSCALLS) == -1 {
- nr = append(nr, j)
- }
- }
- if fuzz_range(nr) {
- unnecessary_syscalls = append(unnecessary_syscalls, i)
- } else {
- fmt.Printf("syscall %d is necessary\n", i)
- }
- }
- }
- func main() {
- fuzz()
- fmt.Printf("Total rans: %d\n", total_rans)
- }
|