Skip to content

Commit

Permalink
fix: uncontrolled data used in path expression
Browse files Browse the repository at this point in the history
  • Loading branch information
0xJacky committed Jul 30, 2024
1 parent 226827f commit 013d810
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 7 deletions.
7 changes: 5 additions & 2 deletions api/certificate/certificate.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"github.com/0xJacky/Nginx-UI/api"
"github.com/0xJacky/Nginx-UI/internal/cert"
"github.com/0xJacky/Nginx-UI/internal/cosy"
"github.com/0xJacky/Nginx-UI/internal/helper"
"github.com/0xJacky/Nginx-UI/internal/nginx"
"github.com/0xJacky/Nginx-UI/internal/notification"
"github.com/0xJacky/Nginx-UI/model"
Expand All @@ -25,7 +26,8 @@ type APICertificate struct {
func Transformer(certModel *model.Cert) (certificate *APICertificate) {
var sslCertificationBytes, sslCertificationKeyBytes []byte
var certificateInfo *cert.Info
if certModel.SSLCertificatePath != "" {
if certModel.SSLCertificatePath != "" &&
helper.IsUnderDirectory(certModel.SSLCertificatePath, nginx.GetConfPath()) {
if _, err := os.Stat(certModel.SSLCertificatePath); err == nil {
sslCertificationBytes, _ = os.ReadFile(certModel.SSLCertificatePath)
if !cert.IsCertificate(string(sslCertificationBytes)) {
Expand All @@ -36,7 +38,8 @@ func Transformer(certModel *model.Cert) (certificate *APICertificate) {
certificateInfo, _ = cert.GetCertInfo(certModel.SSLCertificatePath)
}

if certModel.SSLCertificateKeyPath != "" {
if certModel.SSLCertificateKeyPath != "" &&
helper.IsUnderDirectory(certModel.SSLCertificateKeyPath, nginx.GetConfPath()) {
if _, err := os.Stat(certModel.SSLCertificateKeyPath); err == nil {
sslCertificationKeyBytes, _ = os.ReadFile(certModel.SSLCertificateKeyPath)
if !cert.IsPrivateKey(string(sslCertificationKeyBytes)) {
Expand Down
2 changes: 1 addition & 1 deletion api/config/modify.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ func EditConfig(c *gin.Context) {
return
}

if _, err := os.Stat(path); os.IsNotExist(err) {
if !helper.FileExists(path) {
c.JSON(http.StatusNotFound, gin.H{
"message": "file not found",
})
Expand Down
2 changes: 1 addition & 1 deletion app/src/version.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"version":"2.0.0-beta.29","build_id":152,"total_build":356}
{"version":"2.0.0-beta.29","build_id":154,"total_build":358,"status_hash":"4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945"}
6 changes: 6 additions & 0 deletions internal/cert/cert_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package cert
import (
"crypto/x509"
"encoding/pem"
"github.com/0xJacky/Nginx-UI/internal/helper"
"github.com/0xJacky/Nginx-UI/internal/nginx"
"github.com/pkg/errors"
"os"
"time"
Expand All @@ -16,6 +18,10 @@ type Info struct {
}

func GetCertInfo(sslCertificatePath string) (info *Info, err error) {
if !helper.IsUnderDirectory(sslCertificatePath, nginx.GetConfPath()) {
err = errors.New("ssl certificate path is not under the nginx conf path")
return
}
certData, err := os.ReadFile(sslCertificatePath)
if err != nil {
err = errors.Wrap(err, "error read certificate")
Expand Down
6 changes: 3 additions & 3 deletions internal/cert/payload.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,15 @@ func (c *ConfigPayload) GetKeyType() certcrypto.KeyType {

func (c *ConfigPayload) mkCertificateDir() (err error) {
dir := c.getCertificateDirPath()
if _, err = os.Stat(dir); os.IsNotExist(err) {
if !helper.FileExists(dir) {
err = os.MkdirAll(dir, 0755)
if err == nil {
return nil
}
}

// For windows, replace # with * (issue #403)
c.CertificateDir = strings.ReplaceAll(c.CertificateDir, "#", "*")
// For windows, replace * with # (issue #403)
c.CertificateDir = strings.ReplaceAll(c.CertificateDir, "*", "#")
if _, err = os.Stat(c.CertificateDir); os.IsNotExist(err) {
err = os.MkdirAll(c.CertificateDir, 0755)
if err == nil {
Expand Down
5 changes: 5 additions & 0 deletions internal/chatbot/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ func (c *includeContext) extractIncludes(filename string) {
return
}

if !helper.IsUnderDirectory(filename, nginx.GetConfPath()) {
logger.Error("File is not under the nginx conf path: ", filename)
return
}

// Read the file content
content, err := os.ReadFile(filename)
if err != nil {
Expand Down
3 changes: 3 additions & 0 deletions internal/helper/tar.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"io"
"os"
"path/filepath"
"strings"
)

func UnTar(dst, src string) (err error) {
Expand Down Expand Up @@ -37,6 +38,8 @@ func UnTar(dst, src string) (err error) {
return errors.Wrap(err, "unTar tr.Next() error")
case hdr == nil:
return
case strings.Contains(hdr.Name, ".."):
return
}

dstFileDir := filepath.Join(dst, hdr.Name)
Expand Down

0 comments on commit 013d810

Please sign in to comment.