Skip to content

Commit ec68e52

Browse files
committed
prevent execute permissions from being set
1 parent 28ce8c1 commit ec68e52

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

internal/file/file_manager_service.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import (
1313
"fmt"
1414
"log/slog"
1515
"os"
16+
"strconv"
17+
"strings"
1618
"sync"
1719

1820
"google.golang.org/grpc"
@@ -152,6 +154,11 @@ func (fms *FileManagerService) ConfigApply(ctx context.Context,
152154
return model.Error, allowedErr
153155
}
154156

157+
permissionErr := fms.validateAndFixPermissions(ctx, fileOverview.GetFiles())
158+
if permissionErr != nil {
159+
return model.PermissionChange, permissionErr
160+
}
161+
155162
diffFiles, fileContent, compareErr := fms.DetermineFileActions(
156163
ctx,
157164
fms.currentFilesOnDisk,
@@ -518,6 +525,58 @@ func (fms *FileManagerService) checkAllowedDirectory(checkFiles []*mpi.File) err
518525
return nil
519526
}
520527

528+
func (fms *FileManagerService) validateAndFixPermissions(ctx context.Context, fileList []*mpi.File) error {
529+
var permissionIssues []string
530+
531+
for _, file := range fileList {
532+
if err := fms.checkFilePermissions(file); err != nil {
533+
permissionIssues = append(permissionIssues, file.GetFileMeta().GetName())
534+
535+
if resetErr := fms.resetFilePermissions(file); resetErr != nil {
536+
return fmt.Errorf("failed to reset permissions for %s: %w", file.GetFileMeta().GetName(), resetErr)
537+
}
538+
539+
slog.InfoContext(ctx, "Reset execute permissions", "file", file.GetFileMeta().GetName())
540+
}
541+
}
542+
543+
if len(permissionIssues) > 0 {
544+
return fmt.Errorf("reset execute permissions for files: %s", strings.Join(permissionIssues, ", "))
545+
}
546+
547+
return nil
548+
}
549+
550+
func (fms *FileManagerService) checkFilePermissions(file *mpi.File) error {
551+
filePermission := file.GetFileMeta().GetPermissions()
552+
553+
permissionCodes := filePermission[1:]
554+
555+
for _, digit := range permissionCodes {
556+
singleCode := digit - '0'
557+
558+
if singleCode&1 != 0 {
559+
return fmt.Errorf("file %s has execute permissions", file.GetFileMeta().GetName())
560+
}
561+
}
562+
563+
return nil
564+
}
565+
566+
func (fms *FileManagerService) resetFilePermissions(file *mpi.File) error {
567+
perm, err := strconv.ParseUint("0644", 8, 32)
568+
if err != nil {
569+
return fmt.Errorf("error parsing file permissions: %w", err)
570+
}
571+
572+
err = os.Chmod(file.GetFileMeta().GetName(), os.FileMode(perm))
573+
if err != nil {
574+
return fmt.Errorf("failed to set file permissions: %w", err)
575+
}
576+
577+
return nil
578+
}
579+
521580
func (fms *FileManagerService) convertToManifestFileMap(
522581
currentFiles map[string]*mpi.File,
523582
referenced bool,

internal/file/file_plugin.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,26 @@ func (fp *FilePlugin) handleConfigApplyRequest(ctx context.Context, msg *bus.Mes
347347
}
348348

349349
fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.WriteConfigSuccessfulTopic, Data: data})
350+
case model.PermissionChange:
351+
slog.WarnContext(ctx, "Files with execute permissions found and reset",
352+
"details", err.Error())
353+
dpResponse := fp.createDataPlaneResponse(
354+
correlationID,
355+
mpi.CommandResponse_COMMAND_STATUS_OK,
356+
"Config apply successful, files updated with permission changes",
357+
instanceID,
358+
"",
359+
)
360+
361+
successMessage := &model.ConfigApplySuccess{
362+
ConfigContext: &model.NginxConfigContext{},
363+
DataPlaneResponse: dpResponse,
364+
}
365+
366+
fp.fileManagerService.ClearCache()
367+
fp.messagePipe.Process(ctx, &bus.Message{Topic: bus.ConfigApplySuccessfulTopic, Data: successMessage})
368+
369+
return
350370
}
351371
}
352372

internal/model/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ const (
7575
NoChange
7676
Error
7777
OK
78+
PermissionChange = 5
7879
)
7980

8081
type ConfigApplySuccess struct {

0 commit comments

Comments
 (0)