Skip to content

Commit 4698cfb

Browse files
Merge branch 'main' into bug/AST-106740
2 parents f49e0aa + 6b367a4 commit 4698cfb

File tree

18 files changed

+3566
-2
lines changed

18 files changed

+3566
-2
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package commands
2+
3+
import (
4+
"github.com/checkmarx/ast-cli/internal/commands/util/printer"
5+
errorconstants "github.com/checkmarx/ast-cli/internal/constants/errors"
6+
commonParams "github.com/checkmarx/ast-cli/internal/params"
7+
"github.com/checkmarx/ast-cli/internal/services/realtimeengine/iacrealtime"
8+
"github.com/checkmarx/ast-cli/internal/wrappers"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
func RunScanIacRealtimeCommand(
13+
jwtWrapper wrappers.JWTWrapper,
14+
featureFlagWrapper wrappers.FeatureFlagsWrapper,
15+
) func(cmd *cobra.Command, args []string) error {
16+
return func(cmd *cobra.Command, _ []string) error {
17+
fileSourceFlag, _ := cmd.Flags().GetString(commonParams.SourcesFlag)
18+
if fileSourceFlag == "" {
19+
return errorconstants.NewRealtimeEngineError("file path is required").Error()
20+
}
21+
22+
ignoredFilePathFlag, _ := cmd.Flags().GetString(commonParams.IgnoredFilePathFlag)
23+
engine, _ := cmd.Flags().GetString(commonParams.EngineFlag)
24+
25+
iacRealtimeService := iacrealtime.NewIacRealtimeService(jwtWrapper, featureFlagWrapper, iacrealtime.NewContainerManager())
26+
27+
results, err := iacRealtimeService.RunIacRealtimeScan(fileSourceFlag, engine, ignoredFilePathFlag)
28+
if err != nil {
29+
return err
30+
}
31+
32+
err = printer.Print(cmd.OutOrStdout(), results, printer.FormatJSON)
33+
if err != nil {
34+
return errorconstants.NewRealtimeEngineError("failed to return IaC Realtime vulnerabilities").Error()
35+
}
36+
37+
return nil
38+
}
39+
}

internal/commands/scan.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,8 @@ func NewScanCommand(
225225

226226
secretsRealtimeCmd := scanSecretsRealtimeSubCommand(jwtWrapper, featureFlagsWrapper)
227227

228+
iacRealtimeCmd := scanIacRealtimeSubCommand(jwtWrapper, featureFlagsWrapper)
229+
228230
addFormatFlagToMultipleCommands(
229231
[]*cobra.Command{listScansCmd, showScanCmd, workflowScanCmd},
230232
printer.FormatTable, printer.FormatList, printer.FormatJSON,
@@ -247,6 +249,7 @@ func NewScanCommand(
247249
ossRealtimeCmd,
248250
containersRealtimeCmd,
249251
secretsRealtimeCmd,
252+
iacRealtimeCmd,
250253
)
251254
return scanCmd
252255
}
@@ -499,6 +502,52 @@ func scanOssRealtimeSubCommand(
499502
return scanOssRealtimeCmd
500503
}
501504

505+
func scanIacRealtimeSubCommand(
506+
jwtWrapper wrappers.JWTWrapper,
507+
featureFlagsWrapper wrappers.FeatureFlagsWrapper,
508+
) *cobra.Command {
509+
scanIacRealtimeCmd := &cobra.Command{
510+
Hidden: true,
511+
Use: "iac-realtime",
512+
Short: "Run a IaC-Realtime scan",
513+
Long: "Running a IaC-Realtime scan is a fast and efficient way to identify Infrustructure as Code vulnerabilities in a file.",
514+
Example: heredoc.Doc(
515+
`
516+
$ cx scan iac-realtime -s <path to a manifest file> --ignored-file-path <path to ignored iac vulnerabilities JSON file>
517+
`,
518+
),
519+
Annotations: map[string]string{
520+
"command:doc": heredoc.Doc(
521+
`
522+
https://docs.checkmarx.com/en/34965-68625-checkmarx-one-cli-commands.html
523+
`,
524+
),
525+
},
526+
RunE: RunScanIacRealtimeCommand(jwtWrapper, featureFlagsWrapper),
527+
}
528+
529+
scanIacRealtimeCmd.PersistentFlags().StringP(
530+
commonParams.SourcesFlag,
531+
commonParams.SourcesFlagSh,
532+
"",
533+
"The file source should be the path to a single file",
534+
)
535+
536+
scanIacRealtimeCmd.Flags().String(
537+
commonParams.IgnoredFilePathFlag,
538+
"",
539+
"Path to a JSON file listing ignored iac vulnerabilities",
540+
)
541+
542+
scanIacRealtimeCmd.Flags().String(
543+
commonParams.EngineFlag,
544+
"docker",
545+
"Name of the container engine to run IaC-Realtime. (ex. docker, podman)",
546+
)
547+
548+
return scanIacRealtimeCmd
549+
}
550+
502551
func scanContainersRealtimeSubCommand(realtimeScannerWrapper wrappers.RealtimeScannerWrapper, jwtWrapper wrappers.JWTWrapper, featureFlagsWrapper wrappers.FeatureFlagsWrapper) *cobra.Command {
503552
scanContainersRealtimeCmd := &cobra.Command{
504553
Hidden: true,

internal/commands/util/remediation.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const (
2727
filesContainerVolume = ":/files"
2828
resultsContainerLocation = "/kics/"
2929
containerRemove = "--rm"
30-
containerImage = "checkmarx/kics:v2.1.11"
30+
ContainerImage = "checkmarx/kics:v2.1.11"
3131
containerNameFlag = "--name"
3232
remediateCommand = "remediate"
3333
resultsFlag = "--results"
@@ -247,7 +247,7 @@ func runKicsRemediation(cmd *cobra.Command, volumeMap, tempDir string) error {
247247
kicsFilesPath + filesContainerVolume,
248248
containerNameFlag,
249249
containerName,
250-
containerImage,
250+
ContainerImage,
251251
remediateCommand,
252252
resultsFlag,
253253
resultsContainerLocation + file,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package iacrealtime
2+
3+
import "github.com/checkmarx/ast-cli/internal/services/realtimeengine"
4+
5+
type IacRealtimeResult struct {
6+
SimilarityID string `json:"SimilarityID"`
7+
Title string `json:"Title"`
8+
Description string `json:"Description"`
9+
Severity string `json:"Severity"`
10+
FilePath string `json:"FilePath"`
11+
Locations []realtimeengine.Location `json:"Locations"`
12+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package iacrealtime
2+
3+
const (
4+
ContainerPath = "/path"
5+
ContainerFormat = "json"
6+
ContainerTempDirPattern = "iac-realtime"
7+
KicsContainerPrefix = "cli-iac-realtime-"
8+
ContainerResultsFileName = "results.json"
9+
)
10+
11+
var KicsErrorCodes = []string{"60", "50", "40", "30", "20"}
12+
13+
type LineIndex struct {
14+
Start int
15+
End int
16+
}
17+
18+
var Severities = map[string]string{
19+
"critical": "Critical",
20+
"high": "High",
21+
"medium": "Medium",
22+
"low": "Low",
23+
"info": "Info",
24+
"unknown": "Unknown",
25+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package iacrealtime
2+
3+
import (
4+
"os/exec"
5+
6+
"github.com/checkmarx/ast-cli/internal/commands/util"
7+
commonParams "github.com/checkmarx/ast-cli/internal/params"
8+
"github.com/google/uuid"
9+
"github.com/spf13/viper"
10+
)
11+
12+
// IContainerManager interface for container operations
13+
type IContainerManager interface {
14+
GenerateContainerID() string
15+
RunKicsContainer(engine, volumeMap string) error
16+
}
17+
18+
// ContainerManager handles Docker container operations
19+
type ContainerManager struct{}
20+
21+
func NewContainerManager() IContainerManager {
22+
return &ContainerManager{}
23+
}
24+
25+
func (dm *ContainerManager) GenerateContainerID() string {
26+
containerID := uuid.New().String()
27+
containerName := KicsContainerPrefix + containerID
28+
viper.Set(commonParams.KicsContainerNameKey, containerName)
29+
return containerName
30+
}
31+
32+
func (dm *ContainerManager) RunKicsContainer(engine, volumeMap string) error {
33+
args := []string{
34+
"run", "--rm",
35+
"-v", volumeMap,
36+
"--name", viper.GetString(commonParams.KicsContainerNameKey),
37+
util.ContainerImage,
38+
"scan",
39+
"-p", ContainerPath,
40+
"-o", ContainerPath,
41+
"--report-formats", ContainerFormat,
42+
}
43+
44+
_, err := exec.Command(engine, args...).CombinedOutput()
45+
return err
46+
}

0 commit comments

Comments
 (0)