Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Support for detecting choco installer without required hash #1810

Merged
merged 6 commits into from Apr 25, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
16 changes: 13 additions & 3 deletions checks/pinned_dependencies_test.go
Expand Up @@ -245,7 +245,7 @@ func TestGithubWorkflowPkgManagerPinning(t *testing.T) {
expected: scut.TestReturn{
Error: nil,
Score: checker.MinResultScore,
NumberOfWarn: 26,
NumberOfWarn: 28,
NumberOfInfo: 0,
NumberOfDebug: 0,
},
Expand Down Expand Up @@ -692,6 +692,16 @@ func TestShellscriptInsecureDownloadsLineNumber(t *testing.T) {
startLine: 28,
endLine: 28,
},
{
snippet: "choco install 'some-package'",
startLine: 30,
endLine: 30,
},
{
snippet: "choco install 'some-other-package'",
startLine: 31,
endLine: 31,
},
},
},
}
Expand Down Expand Up @@ -936,7 +946,7 @@ func TestDockerfileScriptDownload(t *testing.T) {
expected: scut.TestReturn{
Error: nil,
Score: checker.MinResultScore,
NumberOfWarn: 37,
NumberOfWarn: 39,
NumberOfInfo: 0,
NumberOfDebug: 0,
},
Expand Down Expand Up @@ -1100,7 +1110,7 @@ func TestShellScriptDownload(t *testing.T) {
expected: scut.TestReturn{
Error: nil,
Score: checker.MinResultScore,
NumberOfWarn: 34,
NumberOfWarn: 36,
NumberOfInfo: 0,
NumberOfDebug: 0,
},
Expand Down
48 changes: 48 additions & 0 deletions checks/shell_download_validate.go
Expand Up @@ -575,6 +575,42 @@ func isPipUnpinnedDownload(cmd []string) bool {
return false
}

func isChocoUnpinnedDownload(cmd []string) bool {
Alan-Jowett marked this conversation as resolved.
Show resolved Hide resolved
// Install command is in the form 'choco install ...'
if len(cmd) < 2 {
return false
}

if !isBinaryName("choco", cmd[0]) && !isBinaryName("choco.exe", cmd[0]) {
return false
}

if !strings.EqualFold(cmd[1], "install") {
return false
}

// If this is an install command, then some variant of requirechecksum must be present.
for i := 1; i < len(cmd); i++ {
parts := strings.Split(cmd[i], "=")
if len(parts) == 0 {
continue
}

str := parts[0]

switch {
laurentsimon marked this conversation as resolved.
Show resolved Hide resolved
case strings.EqualFold(str, "--requirechecksum"):
return false
case strings.EqualFold(str, "--requirechecksums"):
return false
case strings.EqualFold(str, "--require-checksums"):
return false
}
}

return true
}

func isUnpinnedPakageManagerDownload(startLine, endLine uint, node syntax.Node,
cmd, pathfn string, dl checker.DetailLogger,
) bool {
Expand Down Expand Up @@ -629,6 +665,18 @@ func isUnpinnedPakageManagerDownload(startLine, endLine uint, node syntax.Node,
return true
}

// Choco install.
if isChocoUnpinnedDownload(c) {
dl.Warn(&checker.LogMessage{
Path: pathfn,
Type: checker.FileTypeSource,
Offset: startLine,
EndOffset: endLine,
Snippet: cmd,
Text: "choco installation not pinned by hash",
})
return true
}
// TODO(laurent): add other package managers.

return false
Expand Down
Expand Up @@ -98,3 +98,13 @@ jobs:
run: python -m pip install 'some-pkg>1.2.3'
- name:
run: pip3 install -r bla-requirements.txt --require-hashes && pip3 install --require-hashes -r bla-requirements.txt
- name:
run: choco install 'some-package'
- name:
run: choco install 'some-other-package'
- name:
run: choco install --requirechecksum 'some-package'
- name:
run: choco install --requirechecksums 'some-package'
- name:
run: choco install --require-checksums 'some-package'
8 changes: 7 additions & 1 deletion checks/testdata/Dockerfile-pkg-managers
Expand Up @@ -81,4 +81,10 @@ RUN npm install -g
RUN npm i
RUN npm ci
RUN npm install-test
RUN npm install-ci-test
RUN npm install-ci-test

RUN choco install 'some-package'
RUN choco install 'some-other-package'
RUN choco install --requirechecksum 'some-package'
RUN choco install --requirechecksums 'some-package'
RUN choco install --require-checksums 'some-package'
8 changes: 7 additions & 1 deletion checks/testdata/script-pkg-managers
Expand Up @@ -83,4 +83,10 @@ npm install -g
npm i
npm ci
npm install-test
npm install-ci-test
npm install-ci-test

choco install 'some-package'
choco install 'some-other-package'
choco install --requirechecksum 'some-package'
choco install --requirechecksums 'some-package'
choco install --require-checksums 'some-package'
8 changes: 7 additions & 1 deletion checks/testdata/shell-download-lines.sh
Expand Up @@ -25,4 +25,10 @@ echo hi; echo bla; bash <(wget -qO- http://website.com/my-script.sh)
bla && \
pip install -r requirements.txt

bla && curl bla | bash
bla && curl bla | bash

choco install 'some-package'
choco install 'some-other-package'
choco install --requirechecksum 'some-package'
choco install --requirechecksums 'some-package'
choco install --require-checksums 'some-package'