Skip to content

Commit 42f706c

Browse files
Merge branch 'main' of https://github.com/Checkmarx/ast-cli into feature/ast-105749-sbom-scan
2 parents 8d6539a + ca7da82 commit 42f706c

22 files changed

+3574
-14
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
@@ -230,6 +230,8 @@ func NewScanCommand(
230230

231231
secretsRealtimeCmd := scanSecretsRealtimeSubCommand(jwtWrapper, featureFlagsWrapper)
232232

233+
iacRealtimeCmd := scanIacRealtimeSubCommand(jwtWrapper, featureFlagsWrapper)
234+
233235
addFormatFlagToMultipleCommands(
234236
[]*cobra.Command{listScansCmd, showScanCmd, workflowScanCmd},
235237
printer.FormatTable, printer.FormatList, printer.FormatJSON,
@@ -252,6 +254,7 @@ func NewScanCommand(
252254
ossRealtimeCmd,
253255
containersRealtimeCmd,
254256
secretsRealtimeCmd,
257+
iacRealtimeCmd,
255258
)
256259
return scanCmd
257260
}
@@ -504,6 +507,52 @@ func scanOssRealtimeSubCommand(
504507
return scanOssRealtimeCmd
505508
}
506509

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

internal/params/filters.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ var BaseIncludeFilters = []string{
140140
"*.jsx",
141141
"*.bicepparam",
142142
"*.bicep",
143+
"Gemfile",
143144
}
144145

145146
var BaseExcludeFilters = []string{
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)