mirror of
				https://github.com/1Panel-dev/1Panel.git
				synced 2025-10-31 19:26:02 +08:00 
			
		
		
		
	fix: 解决添加仓库注入漏洞问题
This commit is contained in:
		
							parent
							
								
									8ff160408f
								
							
						
					
					
						commit
						321ed00734
					
				
					 2 changed files with 46 additions and 3 deletions
				
			
		|  | @ -3,6 +3,7 @@ package service | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"encoding/json" | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
| 	"os" | 	"os" | ||||||
| 	"path" | 	"path" | ||||||
| 	"strings" | 	"strings" | ||||||
|  | @ -149,7 +150,7 @@ func (u *ImageRepoService) Update(req dto.ImageRepoUpdate) error { | ||||||
| 	if repo.DownloadUrl != req.DownloadUrl || (!repo.Auth && req.Auth) { | 	if repo.DownloadUrl != req.DownloadUrl || (!repo.Auth && req.Auth) { | ||||||
| 		_ = u.handleRegistries(req.DownloadUrl, repo.DownloadUrl, "update") | 		_ = u.handleRegistries(req.DownloadUrl, repo.DownloadUrl, "update") | ||||||
| 		if repo.Auth { | 		if repo.Auth { | ||||||
| 			_, _ = cmd.Execf("docker logout %s", repo.DownloadUrl) | 			_, _ = cmd.ExecWithCheck("docker", "logout", repo.DownloadUrl) | ||||||
| 		} | 		} | ||||||
| 		stdout, err := cmd.Exec("systemctl restart docker") | 		stdout, err := cmd.Exec("systemctl restart docker") | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | @ -176,9 +177,9 @@ func (u *ImageRepoService) Update(req dto.ImageRepoUpdate) error { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (u *ImageRepoService) CheckConn(host, user, password string) error { | func (u *ImageRepoService) CheckConn(host, user, password string) error { | ||||||
| 	stdout, err := cmd.Execf("docker login -u %s -p %s %s", user, password, host) | 	stdout, err := cmd.ExecWithCheck("docker", "login", "-u", user, "-p", password, host) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return errors.New(string(stdout)) | 		return fmt.Errorf("stdout: %s, stderr: %v", stdout, err) | ||||||
| 	} | 	} | ||||||
| 	if strings.Contains(string(stdout), "Login Succeeded") { | 	if strings.Contains(string(stdout), "Login Succeeded") { | ||||||
| 		return nil | 		return nil | ||||||
|  |  | ||||||
|  | @ -3,8 +3,10 @@ package cmd | ||||||
| import ( | import ( | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"os/exec" | 	"os/exec" | ||||||
|  | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
| 	"github.com/1Panel-dev/1Panel/backend/buserr" | 	"github.com/1Panel-dev/1Panel/backend/buserr" | ||||||
|  | @ -117,6 +119,46 @@ func Execf(cmdStr string, a ...interface{}) (string, error) { | ||||||
| 	return stdout.String(), nil | 	return stdout.String(), nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func ExecWithCheck(name string, a ...string) (string, error) { | ||||||
|  | 	if CheckIllegal(a...) { | ||||||
|  | 		return "error exec !", errors.New("There are invalid characters in the command you're executing.") | ||||||
|  | 	} | ||||||
|  | 	cmd := exec.Command(name, a...) | ||||||
|  | 	var stdout, stderr bytes.Buffer | ||||||
|  | 	cmd.Stdout = &stdout | ||||||
|  | 	cmd.Stderr = &stderr | ||||||
|  | 	err := cmd.Run() | ||||||
|  | 	if err != nil { | ||||||
|  | 		errMsg := "" | ||||||
|  | 		if len(stderr.String()) != 0 { | ||||||
|  | 			errMsg = fmt.Sprintf("stderr: %s", stderr.String()) | ||||||
|  | 		} | ||||||
|  | 		if len(stdout.String()) != 0 { | ||||||
|  | 			if len(errMsg) != 0 { | ||||||
|  | 				errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) | ||||||
|  | 			} else { | ||||||
|  | 				errMsg = fmt.Sprintf("stdout: %s", stdout.String()) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return errMsg, err | ||||||
|  | 	} | ||||||
|  | 	return stdout.String(), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CheckIllegal(args ...string) bool { | ||||||
|  | 	if args == nil { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	for _, arg := range args { | ||||||
|  | 		if strings.Contains(arg, "&") || strings.Contains(arg, "|") || strings.Contains(arg, ";") || | ||||||
|  | 			strings.Contains(arg, "$") || strings.Contains(arg, "'") || strings.Contains(arg, "`") || | ||||||
|  | 			strings.Contains(arg, "(") || strings.Contains(arg, ")") || strings.Contains(arg, "\"") { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func HasNoPasswordSudo() bool { | func HasNoPasswordSudo() bool { | ||||||
| 	cmd2 := exec.Command("sudo", "-n", "ls") | 	cmd2 := exec.Command("sudo", "-n", "ls") | ||||||
| 	err2 := cmd2.Run() | 	err2 := cmd2.Run() | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue