From d00d03e823b5fab65c6f64cc410177ec90653bd8 Mon Sep 17 00:00:00 2001 From: Simon Date: Wed, 16 Nov 2022 17:00:26 +0100 Subject: [PATCH] :alien: :sparkles: Adjusted Action to work with new Report Format (#15) * :wrench: Allow setting Debug via ENV for debugging * :loud_sound: Added additional logs prior conversion * :see_no_evil: Investigate missing callsites * minor * :sparkles: Allowing exporting raw report * :rewind: Revert unneeded changes * :fire: Removed unused files * :monocle_face: Uploaded new JSON Format * :arrow_up: Updated Modules * :sparkles: Exposing raw-report in DEBUG mode * :alien: Reacting to govulncheck json report change * :bug: Fixing Format issue * :white_check_mark: Adjusted Test * :memo: Updated Limitations * :monocle_face: Updated Data * :sparkles: Handling Direct Calls & Imports * :white_check_mark: Adjusted Tests to new data * :fire: Removed unused Type * :recycle: Added back text + mark down * :memo: Adjusted Documentation Hopefully this makes clear where results are located * :recycle: Adjusted Filename Handling * :bento: Taking uncompressed files --- README.md | 18 +- action.yml | 2 +- docs/locate_results.png | Bin 0 -> 65951 bytes docs/results.png | Bin 0 -> 78495 bytes go.mod | 12 +- go.sum | 28 +- hack/found.json | 4433 ++++--------------------------- main.go | 9 +- pkg/action/preprocessor.go | 76 - pkg/action/preprocessor_test.go | 152 -- pkg/github/sarif_report_test.go | 2 +- pkg/sarif/reporter.go | 160 +- pkg/sarif/reporter_test.go | 12 +- pkg/types/call_chain.go | 44 - pkg/types/reporter.go | 2 +- pkg/types/result.go | 104 +- pkg/vulncheck/resolver.go | 177 -- pkg/vulncheck/runner.go | 28 +- pkg/vulncheck/static_runner.go | 6 +- 19 files changed, 725 insertions(+), 4540 deletions(-) create mode 100644 docs/locate_results.png create mode 100644 docs/results.png delete mode 100644 pkg/action/preprocessor.go delete mode 100644 pkg/action/preprocessor_test.go delete mode 100644 pkg/types/call_chain.go delete mode 100644 pkg/vulncheck/resolver.go diff --git a/README.md b/README.md index 9952ad6..eea67b3 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,9 @@ This action uses govulncheck to perform a scan of the code, afterwards it will p For a full list of currently known limitations please head over to [here](https://pkg.go.dev/golang.org/x/vuln/cmd/govulncheck#hdr-Limitations). Listed below are an important overview. -* Govulncheck only reads binaries compiled with Go 1.18 and later. -* Govulncheck only reports vulnerabilities that apply to the current Go build system and configuration (GOOS/GOARCH settings). +* Govulncheck analyzes function pointer and interface calls conservatively, which may result in false positives or inaccurate call stacks in some cases. +* Calls to functions made using package reflect are not visible to static analysis. Vulnerable code reachable only through those calls will not be reported. +* There is no support for silencing vulnerability findings. ## :books: Useful links & resources on govulncheck :books: @@ -18,6 +19,19 @@ For a full list of currently known limitations please head over to [here](https: ## Usage +
+ + Where can I find the scan results of this action ? + + +Please be aware there will be no direct output to the console, all found vulnerabilities will be reported to Github via an Sarif Report. Therefore all findings should be located in the *Security*-Tab under the *Code Scanning*-Section. + +![Locating Code Scanning](docs/locate_results.png) + +![Result List](docs/results.png) + +
+ ### Example Workflows
diff --git a/action.yml b/action.yml index 46bd7ae..462aac8 100644 --- a/action.yml +++ b/action.yml @@ -34,7 +34,7 @@ runs: run: docker build --build-arg GOLANG_VERSION=${{ inputs.go-version }} --build-arg VULNCHECK_VERSION=${{ inputs.vulncheck-version }} -q -f $GITHUB_ACTION_PATH/Dockerfile -t templum/govulncheck-action:local $GITHUB_ACTION_PATH shell: bash - id: run - run: docker run --rm -v $(pwd):/github/workspace --workdir /github/workspace -e GITHUB_TOKEN=${{ inputs.github-token }} -e STRICT=${{ inputs.fail-on-vuln }} -e PACKAGE=${{ inputs.package }} -e SKIP_UPLOAD=${{ inputs.skip-upload }} -e GITHUB_REPOSITORY=${{ github.repository }} -e GITHUB_REF=${{ github.ref }} -e GITHUB_SHA=${{ github.sha }} templum/govulncheck-action:local + run: docker run --rm -v $(pwd):/github/workspace --workdir /github/workspace -e GITHUB_TOKEN=${{ inputs.github-token }} -e STRICT=${{ inputs.fail-on-vuln }} -e PACKAGE=${{ inputs.package }} -e SKIP_UPLOAD=${{ inputs.skip-upload }} -e DEBUG=${DEBUG} -e GITHUB_REPOSITORY=${{ github.repository }} -e GITHUB_REF=${{ github.ref }} -e GITHUB_SHA=${{ github.sha }} templum/govulncheck-action:local shell: bash branding: diff --git a/docs/locate_results.png b/docs/locate_results.png new file mode 100644 index 0000000000000000000000000000000000000000..57e3e76894c8cc3dea2abb7332b8546ddfaa36ff GIT binary patch literal 65951 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 literal 0 HcmV?d00001 diff --git a/docs/results.png b/docs/results.png new file mode 100644 index 0000000000000000000000000000000000000000..b1a315eb1af7c16a0f98fccaebdca2172b144a6e GIT binary patch literal 78495 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 XH*aK*)+QR@0M{c~Wf{2Ci-3OsfY-`E literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index 86c5942..c3e0b17 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/Templum/govulncheck-action go 1.19 -require golang.org/x/vuln v0.0.0-20220914160157-cac67f5c7c81 +require golang.org/x/vuln v0.0.0-20221111165027-50a0e29f49cc require ( github.com/davecgh/go-spew v1.1.1 // indirect @@ -12,8 +12,8 @@ require ( github.com/mattn/go-isatty v0.0.14 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.5.0 // indirect - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect - golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + golang.org/x/crypto v0.1.0 // indirect + golang.org/x/net v0.1.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.28.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect @@ -24,9 +24,7 @@ require ( github.com/owenrumney/go-sarif/v2 v2.1.2 github.com/rs/zerolog v1.28.0 github.com/stretchr/testify v1.8.1 - golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/mod v0.6.0 // indirect golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 - golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect - golang.org/x/tools v0.1.13-0.20220803210227-8b9a1fbdf5c3 // indirect + golang.org/x/sys v0.1.0 // indirect ) diff --git a/go.sum b/go.sum index c01ad45..ad8a145 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,4 @@ -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -50,31 +48,27 @@ github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+ github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/crypto v0.1.0 h1:MDRAIl0xIo9Io2xV565hzXHw3zVseKrJKodhohM5CjU= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/mod v0.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1 h1:lxqLZaMad/dJHMFZH0NiNpiEZI/nhgWhe4wgzpE+MuA= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.1.13-0.20220803210227-8b9a1fbdf5c3 h1:aE4T3aJwdCNz+s35ScSQYUzeGu7BOLDHZ1bBHVurqqY= -golang.org/x/tools v0.1.13-0.20220803210227-8b9a1fbdf5c3/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/vuln v0.0.0-20220914160157-cac67f5c7c81 h1:PlNfGv/lMyN1WatEzczf4kNOrjQ0dg3KFuqJIo+18Tw= -golang.org/x/vuln v0.0.0-20220914160157-cac67f5c7c81/go.mod h1:7tDfEDtOLlzHQRi4Yzfg5seVBSvouUIjyPzBx4q5CxQ= +golang.org/x/vuln v0.0.0-20221111165027-50a0e29f49cc h1:/LBdtEOGH9HDO8+sj6+oU/QnYUMwc8MyO6Jd8oYh+D4= +golang.org/x/vuln v0.0.0-20221111165027-50a0e29f49cc/go.mod h1:8nFLBv8KFyZ2VuczUYssYKh+fcBR3BuXDG/HIWcxlwM= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= @@ -89,5 +83,3 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.2.2 h1:MNh1AVMyVX23VUHE2O27jm6lNj3vjO5DexS4A1xvnzk= -mvdan.cc/unparam v0.0.0-20211214103731-d0ef000c54e5 h1:Jh3LAeMt1eGpxomyu3jVkmVZWW2MxZ1qIIV2TZ/nRio= diff --git a/hack/found.json b/hack/found.json index 76a340c..2dc067c 100644 --- a/hack/found.json +++ b/hack/found.json @@ -1,3526 +1,18 @@ { - "Calls": { - "Functions": { - "1": { - "ID": 1, - "Name": "main", - "RecvType": "", - "PkgPath": "github.com/Templum/playground", - "Pos": { - "Filename": "/workspaces/govulncheck-action/main.go", - "Offset": 232, - "Line": 11, - "Column": 6 - }, - "CallSites": null - }, - "10": { - "ID": 10, - "Name": "yaml_parser_roll_indent", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 27804, - "Line": 931, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 57, - "Name": "yaml_parser_roll_indent", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 34648, - "Line": 1196, - "Column": 30 - }, - "Resolved": true - }, - { - "Parent": 58, - "Name": "yaml_parser_roll_indent", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 37172, - "Line": 1283, - "Column": 30 - }, - "Resolved": true - }, - { - "Parent": 58, - "Name": "yaml_parser_roll_indent", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 37897, - "Line": 1308, - "Column": 31 - }, - "Resolved": true - }, - { - "Parent": 59, - "Name": "yaml_parser_roll_indent", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 35945, - "Line": 1239, - "Column": 30 - }, - "Resolved": true - } - ] - }, - "11": { - "ID": 11, - "Name": "yaml_parser_fetch_more_tokens", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 17667, - "Line": 626, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 27, - "Name": "yaml_parser_fetch_more_tokens", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 2220, - "Line": 47, - "Column": 60 - }, - "Resolved": true - } - ] - }, - "12": { - "ID": 12, - "Name": "Get", - "RecvType": "", - "PkgPath": "github.com/tidwall/gjson", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 37859, - "Line": 1873, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 3, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/seconds/mixer.go", - "Offset": 257, - "Line": 15, - "Column": 18 - }, - "Resolved": true - }, - { - "Parent": 7, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 5781, - "Line": 297, - "Column": 12 - }, - "Resolved": true - }, - { - "Parent": 12, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 38198, - "Line": 1885, - "Column": 17 - }, - "Resolved": true - }, - { - "Parent": 12, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 38654, - "Line": 1905, - "Column": 17 - }, - "Resolved": true - }, - { - "Parent": 2, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/json/testcase.go", - "Offset": 162, - "Line": 11, - "Column": 20 - }, - "Resolved": true - } - ] - }, - "13": { - "ID": 13, - "Name": "yaml_parser_increase_flow_level", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 27111, - "Line": 910, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 55, - "Name": "yaml_parser_increase_flow_level", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 32293, - "Line": 1106, - "Column": 37 - }, - "Resolved": true - } - ] - }, - "14": { - "ID": 14, - "Name": "MustParse", - "RecvType": "", - "PkgPath": "golang.org/x/text/language", - "Pos": { - "Filename": "/go/pkg/mod/golang.org/x/text@v0.3.6/language/tags.go", - "Offset": 427, - "Line": 13, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 3, - "Name": "MustParse", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/seconds/mixer.go", - "Offset": 204, - "Line": 12, - "Column": 29 - }, - "Resolved": true - }, - { - "Parent": 4, - "Name": "MustParse", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/text/testcase.go", - "Offset": 102, - "Line": 8, - "Column": 29 - }, - "Resolved": true - } - ] - }, - "15": { - "ID": 15, - "Name": "queryMatches", - "RecvType": "", - "PkgPath": "github.com/tidwall/gjson", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 25066, - "Line": 1265, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 18, - "Name": "queryMatches", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 27271, - "Line": 1377, - "Column": 18 - }, - "Resolved": true - } - ] - }, - "16": { - "ID": 16, - "Name": "parseObject", - "RecvType": "", - "PkgPath": "github.com/tidwall/gjson", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 21927, - "Line": 1114, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 17, - "Name": "parseObject", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 28823, - "Line": 1462, - "Column": 26 - }, - "Resolved": true - }, - { - "Parent": 16, - "Name": "parseObject", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 24057, - "Line": 1212, - "Column": 26 - }, - "Resolved": true - }, - { - "Parent": 12, - "Name": "parseObject", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 39894, - "Line": 1963, - "Column": 16 - }, - "Resolved": true - } - ] - }, - "17": { - "ID": 17, - "Name": "parseArray", - "RecvType": "", - "PkgPath": "github.com/tidwall/gjson", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 26587, - "Line": 1341, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 12, - "Name": "parseArray", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 39788, - "Line": 1958, - "Column": 13 - }, - "Resolved": true - }, - { - "Parent": 16, - "Name": "parseArray", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 24326, - "Line": 1226, - "Column": 25 - }, - "Resolved": true - }, - { - "Parent": 17, - "Name": "parseArray", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 29286, - "Line": 1486, - "Column": 25 - }, - "Resolved": true - }, - { - "Parent": 12, - "Name": "parseArray", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 39969, - "Line": 1968, - "Column": 15 - }, - "Resolved": true - } - ] - }, - "18": { - "ID": 18, - "Name": "parseArray$1", - "RecvType": "", - "PkgPath": "github.com/tidwall/gjson", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 26982, - "Line": 1362, - "Column": 15 - }, - "CallSites": [ - { - "Parent": 17, - "Name": "t21", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 28463, - "Line": 1444, - "Column": 18 - }, - "Resolved": true - }, - { - "Parent": 17, - "Name": "t21", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 29015, - "Line": 1472, - "Column": 19 - }, - "Resolved": true - }, - { - "Parent": 17, - "Name": "t21", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 29478, - "Line": 1496, - "Column": 19 - }, - "Resolved": true - }, - { - "Parent": 17, - "Name": "t21", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 29937, - "Line": 1515, - "Column": 18 - }, - "Resolved": true - }, - { - "Parent": 17, - "Name": "t21", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 30419, - "Line": 1539, - "Column": 18 - }, - "Resolved": true - } - ] - }, - "19": { - "ID": 19, - "Name": "unmarshal", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/yaml.go", - "Offset": 4340, - "Line": 137, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 8, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/yaml.go", - "Offset": 2826, - "Line": 81, - "Column": 18 - }, - "Resolved": true - } - ] - }, - "2": { - "ID": 2, - "Name": "Testcase", - "RecvType": "", - "PkgPath": "github.com/Templum/playground/pkg/json", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/json/testcase.go", - "Offset": 130, - "Line": 10, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 1, - "Name": "Testcase", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/main.go", - "Offset": 255, - "Line": 12, - "Column": 15 - }, - "Resolved": true - } - ] - }, - "20": { - "ID": 20, - "Name": "merge", - "RecvType": "*gopkg.in/yaml.v2.decoder", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 17803, - "Line": 744, - "Column": 19 - }, - "CallSites": [ - { - "Parent": 21, - "Name": "merge", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 16710, - "Line": 705, - "Column": 11 - }, - "Resolved": true - }, - { - "Parent": 22, - "Name": "merge", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 14719, - "Line": 621, - "Column": 11 - }, - "Resolved": true - }, - { - "Parent": 23, - "Name": "merge", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 15783, - "Line": 665, - "Column": 11 - }, - "Resolved": true - } - ] - }, - "21": { - "ID": 21, - "Name": "mappingStruct", - "RecvType": "*gopkg.in/yaml.v2.decoder", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 16136, - "Line": 682, - "Column": 19 - }, - "CallSites": [ - { - "Parent": 22, - "Name": "mappingStruct", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 13978, - "Line": 584, - "Column": 25 - }, - "Resolved": true - } - ] - }, - "22": { - "ID": 22, - "Name": "mapping", - "RecvType": "*gopkg.in/yaml.v2.decoder", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 13861, - "Line": 581, - "Column": 19 - }, - "CallSites": [ - { - "Parent": 9, - "Name": "mapping", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 7743, - "Line": 332, - "Column": 19 - }, - "Resolved": true - } - ] - }, - "23": { - "ID": 23, - "Name": "mappingSlice", - "RecvType": "*gopkg.in/yaml.v2.decoder", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 15467, - "Line": 651, - "Column": 19 - }, - "CallSites": [ - { - "Parent": 22, - "Name": "mappingSlice", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 14031, - "Line": 586, - "Column": 24 - }, - "Resolved": true - }, - { - "Parent": 22, - "Name": "mappingSlice", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 14278, - "Line": 596, - "Column": 22 - }, - "Resolved": true - } - ] - }, - "24": { - "ID": 24, - "Name": "document", - "RecvType": "*gopkg.in/yaml.v2.decoder", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 7917, - "Line": 341, - "Column": 19 - }, - "CallSites": [ - { - "Parent": 9, - "Name": "document", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 7511, - "Line": 320, - "Column": 20 - }, - "Resolved": true - } - ] - }, - "25": { - "ID": 25, - "Name": "sequence", - "RecvType": "*gopkg.in/yaml.v2.decoder", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 13038, - "Line": 543, - "Column": 19 - }, - "CallSites": [ - { - "Parent": 9, - "Name": "sequence", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 7791, - "Line": 334, - "Column": 20 - }, - "Resolved": true - } - ] - }, - "26": { - "ID": 26, - "Name": "alias", - "RecvType": "*gopkg.in/yaml.v2.decoder", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 8093, - "Line": 350, - "Column": 19 - }, - "CallSites": [ - { - "Parent": 9, - "Name": "alias", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 7553, - "Line": 322, - "Column": 17 - }, - "Resolved": true - } - ] - }, - "27": { - "ID": 27, - "Name": "peek_token", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 2111, - "Line": 46, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 28, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 31112, - "Line": 971, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 28, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 31376, - "Line": 981, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 40, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 12542, - "Line": 362, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 40, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 13239, - "Line": 391, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 40, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 13503, - "Line": 402, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 40, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 13805, - "Line": 415, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 40, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 13988, - "Line": 423, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 41, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 23280, - "Line": 734, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 41, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 23428, - "Line": 741, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 42, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 26456, - "Line": 834, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 43, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 29084, - "Line": 906, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 43, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 29194, - "Line": 911, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 43, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 29390, - "Line": 920, - "Column": 23 - }, - "Resolved": true - }, - { - "Parent": 43, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 29819, - "Line": 935, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 44, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 24637, - "Line": 772, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 44, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 24746, - "Line": 776, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 44, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 24942, - "Line": 784, - "Column": 23 - }, - "Resolved": true - }, - { - "Parent": 45, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 21536, - "Line": 677, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 45, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 21646, - "Line": 682, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 45, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 21793, - "Line": 690, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 46, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 20086, - "Line": 632, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 46, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 20241, - "Line": 640, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 47, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 27253, - "Line": 855, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 47, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 27377, - "Line": 861, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 48, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 9755, - "Line": 283, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 49, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 18526, - "Line": 581, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 49, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 18636, - "Line": 586, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 49, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 18791, - "Line": 594, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 50, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 28119, - "Line": 879, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 51, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 7443, - "Line": 200, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 51, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 7635, - "Line": 209, - "Column": 22 - }, - "Resolved": true - }, - { - "Parent": 51, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 8577, - "Line": 241, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 52, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 32571, - "Line": 1020, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 52, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 33523, - "Line": 1053, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 53, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 10591, - "Line": 306, - "Column": 21 - }, - "Resolved": true - }, - { - "Parent": 54, - "Name": "peek_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 6628, - "Line": 175, - "Column": 21 - }, - "Resolved": true - } - ] - }, - "28": { - "ID": 28, - "Name": "yaml_parser_parse_flow_mapping_value", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 30992, - "Line": 970, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_mapping_value", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 6200, - "Line": 161, - "Column": 46 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_mapping_value", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 6318, - "Line": 164, - "Column": 46 - }, - "Resolved": true - } - ] - }, - "29": { - "ID": 29, - "Name": "yaml_parser_state_machine", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 3588, - "Line": 93, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 30, - "Name": "yaml_parser_state_machine", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 2972, - "Line": 72, - "Column": 34 - }, - "Resolved": true - } - ] - }, - "3": { - "ID": 3, - "Name": "Testcase", - "RecvType": "", - "PkgPath": "github.com/Templum/playground/pkg/seconds", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/seconds/mixer.go", - "Offset": 162, - "Line": 10, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 1, - "Name": "Testcase", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/main.go", - "Offset": 309, - "Line": 15, - "Column": 18 - }, - "Resolved": true - } - ] - }, - "30": { - "ID": 30, - "Name": "yaml_parser_parse", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 2611, - "Line": 62, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 31, - "Name": "yaml_parser_parse", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 2134, - "Line": 105, - "Column": 23 - }, - "Resolved": true - }, - { - "Parent": 36, - "Name": "yaml_parser_parse", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 1559, - "Line": 84, - "Column": 24 - }, - "Resolved": true - } - ] - }, - "31": { - "ID": 31, - "Name": "peek", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 2026, - "Line": 101, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 32, - "Name": "peek", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 2928, - "Line": 143, - "Column": 15 - }, - "Resolved": true - }, - { - "Parent": 33, - "Name": "peek", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4359, - "Line": 205, - "Column": 12 - }, - "Resolved": true - }, - { - "Parent": 34, - "Name": "peek", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4624, - "Line": 216, - "Column": 12 - }, - "Resolved": true - } - ] - }, - "32": { - "ID": 32, - "Name": "parse", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 2888, - "Line": 141, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 19, - "Name": "parse", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/yaml.go", - "Offset": 4508, - "Line": 142, - "Column": 17 - }, - "Resolved": true - }, - { - "Parent": 33, - "Name": "parse", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4432, - "Line": 206, - "Column": 42 - }, - "Resolved": true - }, - { - "Parent": 34, - "Name": "parse", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4696, - "Line": 217, - "Column": 42 - }, - "Resolved": true - }, - { - "Parent": 34, - "Name": "parse", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4707, - "Line": 217, - "Column": 53 - }, - "Resolved": true - }, - { - "Parent": 35, - "Name": "parse", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3703, - "Line": 175, - "Column": 41 - }, - "Resolved": true - } - ] - }, - "33": { - "ID": 33, - "Name": "sequence", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4236, - "Line": 201, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 32, - "Name": "sequence", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3126, - "Line": 151, - "Column": 20 - }, - "Resolved": true - } - ] - }, - "34": { - "ID": 34, - "Name": "mapping", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4504, - "Line": 212, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 32, - "Name": "mapping", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3071, - "Line": 149, - "Column": 19 - }, - "Resolved": true - } - ] - }, - "35": { - "ID": 35, - "Name": "document", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3533, - "Line": 170, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 32, - "Name": "document", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3181, - "Line": 153, - "Column": 20 - }, - "Resolved": true - } - ] - }, - "36": { - "ID": 36, - "Name": "expect", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 1471, - "Line": 82, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 33, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4320, - "Line": 204, - "Column": 10 - }, - "Resolved": true - }, - { - "Parent": 33, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4448, - "Line": 208, - "Column": 10 - }, - "Resolved": true - }, - { - "Parent": 34, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4586, - "Line": 215, - "Column": 10 - }, - "Resolved": true - }, - { - "Parent": 34, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4723, - "Line": 219, - "Column": 10 - }, - "Resolved": true - }, - { - "Parent": 35, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3635, - "Line": 174, - "Column": 10 - }, - "Resolved": true - }, - { - "Parent": 35, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3716, - "Line": 176, - "Column": 10 - }, - "Resolved": true - }, - { - "Parent": 37, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3964, - "Line": 187, - "Column": 10 - }, - "Resolved": true - }, - { - "Parent": 38, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4186, - "Line": 197, - "Column": 10 - }, - "Resolved": true - }, - { - "Parent": 39, - "Name": "expect", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 1179, - "Line": 69, - "Column": 10 - }, - "Resolved": true - } - ] - }, - "37": { - "ID": 37, - "Name": "alias", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3772, - "Line": 180, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 32, - "Name": "alias", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 3018, - "Line": 147, - "Column": 17 - }, - "Resolved": true - } - ] - }, - "38": { - "ID": 38, - "Name": "scalar", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 4013, - "Line": 191, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 32, - "Name": "scalar", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 2975, - "Line": 145, - "Column": 18 - }, - "Resolved": true - } - ] - }, - "39": { - "ID": 39, - "Name": "init", - "RecvType": "*gopkg.in/yaml.v2.parser", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 1132, - "Line": 65, - "Column": 18 - }, - "CallSites": [ - { - "Parent": 32, - "Name": "init", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 2911, - "Line": 142, - "Column": 8 - }, - "Resolved": true - } - ] - }, - "4": { - "ID": 4, - "Name": "Testcase", - "RecvType": "", - "PkgPath": "github.com/Templum/playground/pkg/text", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/text/testcase.go", - "Offset": 61, - "Line": 7, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 1, - "Name": "Testcase", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/main.go", - "Offset": 272, - "Line": 13, - "Column": 15 - }, - "Resolved": true - } - ] - }, - "40": { - "ID": 40, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 12309, - "Line": 359, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 28, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 31619, - "Line": 987, - "Column": 33 - }, - "Resolved": true - }, - { - "Parent": 41, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 23697, - "Line": 749, - "Column": 33 - }, - "Resolved": true - }, - { - "Parent": 42, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 26748, - "Line": 842, - "Column": 32 - }, - "Resolved": true - }, - { - "Parent": 43, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 30111, - "Line": 943, - "Column": 34 - }, - "Resolved": true - }, - { - "Parent": 43, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 30461, - "Line": 950, - "Column": 33 - }, - "Resolved": true - }, - { - "Parent": 44, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 25816, - "Line": 810, - "Column": 33 - }, - "Resolved": true - }, - { - "Parent": 45, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 22064, - "Line": 698, - "Column": 33 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4329, - "Line": 113, - "Column": 32 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4448, - "Line": 116, - "Column": 32 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4542, - "Line": 119, - "Column": 32 - }, - "Resolved": true - }, - { - "Parent": 46, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 20560, - "Line": 649, - "Column": 33 - }, - "Resolved": true - }, - { - "Parent": 47, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 27636, - "Line": 867, - "Column": 33 - }, - "Resolved": true - }, - { - "Parent": 48, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 10237, - "Line": 297, - "Column": 31 - }, - "Resolved": true - }, - { - "Parent": 49, - "Name": "yaml_parser_parse_node", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 19032, - "Line": 600, - "Column": 33 - }, - "Resolved": true - } - ] - }, - "41": { - "ID": 41, - "Name": "yaml_parser_parse_block_mapping_value", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 23171, - "Line": 733, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_block_mapping_value", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5244, - "Line": 137, - "Column": 47 - }, - "Resolved": true - } - ] - }, - "42": { - "ID": 42, - "Name": "yaml_parser_parse_flow_sequence_entry_mapping_key", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 26335, - "Line": 833, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_sequence_entry_mapping_key", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5608, - "Line": 146, - "Column": 59 - }, - "Resolved": true - } - ] - }, - "43": { - "ID": 43, - "Name": "yaml_parser_parse_flow_mapping_key", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 28953, - "Line": 904, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_mapping_key", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5981, - "Line": 155, - "Column": 44 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_mapping_key", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 6088, - "Line": 158, - "Column": 44 - }, - "Resolved": true - } - ] - }, - "44": { - "ID": 44, - "Name": "yaml_parser_parse_flow_sequence_entry", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 24503, - "Line": 770, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_sequence_entry", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5357, - "Line": 140, - "Column": 47 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_sequence_entry", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5470, - "Line": 143, - "Column": 47 - }, - "Resolved": true - } - ] - }, - "45": { - "ID": 45, - "Name": "yaml_parser_parse_block_mapping_key", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 21404, - "Line": 675, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_block_mapping_key", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5021, - "Line": 131, - "Column": 45 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_block_mapping_key", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5130, - "Line": 134, - "Column": 45 - }, - "Resolved": true - } - ] - }, - "46": { - "ID": 46, - "Name": "yaml_parser_parse_indentless_sequence_entry", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 19971, - "Line": 631, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_indentless_sequence_entry", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4912, - "Line": 128, - "Column": 53 - }, - "Resolved": true - } - ] - }, - "47": { - "ID": 47, - "Name": "yaml_parser_parse_flow_sequence_entry_mapping_value", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 27130, - "Line": 854, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_sequence_entry_mapping_value", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5743, - "Line": 149, - "Column": 61 - }, - "Resolved": true - } - ] - }, - "48": { - "ID": 48, - "Name": "yaml_parser_parse_document_content", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 9649, - "Line": 282, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_document_content", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4153, - "Line": 107, - "Column": 44 - }, - "Resolved": true - } - ] - }, - "49": { - "ID": 49, - "Name": "yaml_parser_parse_block_sequence_entry", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 18391, - "Line": 579, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_block_sequence_entry", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4671, - "Line": 122, - "Column": 48 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_block_sequence_entry", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4786, - "Line": 125, - "Column": 48 - }, - "Resolved": true - } - ] - }, - "5": { - "ID": 5, - "Name": "Testcase", - "RecvType": "", - "PkgPath": "github.com/Templum/playground/pkg/yaml", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/yaml/testcase.go", - "Offset": 306, - "Line": 26, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 1, - "Name": "Testcase", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/main.go", - "Offset": 289, - "Line": 14, - "Column": 15 - }, - "Resolved": true - } - ] - }, - "50": { - "ID": 50, - "Name": "yaml_parser_parse_flow_sequence_entry_mapping_end", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 27998, - "Line": 878, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_flow_sequence_entry_mapping_end", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 5874, - "Line": 152, - "Column": 59 - }, - "Resolved": true - } - ] - }, - "51": { - "ID": 51, - "Name": "yaml_parser_parse_document_start", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 7323, - "Line": 198, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_document_start", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 3942, - "Line": 101, - "Column": 42 - }, - "Resolved": true - }, - { - "Parent": 29, - "Name": "yaml_parser_parse_document_start", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4045, - "Line": 104, - "Column": 42 - }, - "Resolved": true - } - ] - }, - "52": { - "ID": 52, - "Name": "yaml_parser_process_directives", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 32300, - "Line": 1013, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 51, - "Name": "yaml_parser_process_directives", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 7951, - "Line": 221, - "Column": 37 - }, - "Resolved": true - }, - { - "Parent": 51, - "Name": "yaml_parser_process_directives", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 8489, - "Line": 238, - "Column": 37 - }, - "Resolved": true - } - ] - }, - "53": { - "ID": 53, - "Name": "yaml_parser_parse_document_end", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 10489, - "Line": 305, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_document_end", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 4246, - "Line": 110, - "Column": 40 - }, - "Resolved": true - } - ] - }, - "54": { - "ID": 54, - "Name": "yaml_parser_parse_stream_start", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 6526, - "Line": 174, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 29, - "Name": "yaml_parser_parse_stream_start", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/parserc.go", - "Offset": 3836, - "Line": 98, - "Column": 40 - }, - "Resolved": true - } - ] - }, - "55": { - "ID": 55, - "Name": "yaml_parser_fetch_flow_collection_start", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 32018, - "Line": 1099, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 56, - "Name": "yaml_parser_fetch_flow_collection_start", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 20412, - "Line": 722, - "Column": 49 - }, - "Resolved": true - }, - { - "Parent": 56, - "Name": "yaml_parser_fetch_flow_collection_start", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 20595, - "Line": 727, - "Column": 49 - }, - "Resolved": true - } - ] - }, - "56": { - "ID": 56, - "Name": "yaml_parser_fetch_next_token", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 18571, - "Line": 665, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 11, - "Name": "yaml_parser_fetch_next_token", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 18446, - "Line": 655, - "Column": 35 - }, - "Resolved": true - } - ] - }, - "57": { - "ID": 57, - "Name": "yaml_parser_fetch_block_entry", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 34213, - "Line": 1187, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 56, - "Name": "yaml_parser_fetch_block_entry", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 21301, - "Line": 749, - "Column": 39 - }, - "Resolved": true - } - ] - }, - "58": { - "ID": 58, - "Name": "yaml_parser_fetch_value", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 36627, - "Line": 1268, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 56, - "Name": "yaml_parser_fetch_value", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 21693, - "Line": 759, - "Column": 33 - }, - "Resolved": true - } - ] - }, - "59": { - "ID": 59, - "Name": "yaml_parser_fetch_key", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 35499, - "Line": 1229, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 56, - "Name": "yaml_parser_fetch_key", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/scannerc.go", - "Offset": 21495, - "Line": 754, - "Column": 31 - }, - "Resolved": true - } - ] - }, - "6": { - "ID": 6, - "Name": "Parse", - "RecvType": "", - "PkgPath": "golang.org/x/text/language", - "Pos": { - "Filename": "/go/pkg/mod/golang.org/x/text@v0.3.6/language/parse.go", - "Offset": 1121, - "Line": 33, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 14, - "Name": "Parse", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/golang.org/x/text@v0.3.6/language/tags.go", - "Offset": 469, - "Line": 14, - "Column": 17 - }, - "Resolved": true - } - ] - }, - "7": { - "ID": 7, - "Name": "Get", - "RecvType": "github.com/tidwall/gjson.Result", - "PkgPath": "github.com/tidwall/gjson", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 5744, - "Line": 296, - "Column": 17 - }, - "CallSites": [ - { - "Parent": 17, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 31327, - "Line": 1579, - "Column": 24 - }, - "Resolved": true - }, - { - "Parent": 18, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 27159, - "Line": 1370, - "Column": 18 - }, - "Resolved": true - }, - { - "Parent": 18, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 27446, - "Line": 1385, - "Column": 19 - }, - "Resolved": true - }, - { - "Parent": 12, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 39584, - "Line": 1945, - "Column": 20 - }, - "Resolved": true - }, - { - "Parent": 12, - "Name": "Get", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - "Offset": 40038, - "Line": 1974, - "Column": 21 - }, - "Resolved": true - } - ] - }, - "8": { - "ID": 8, - "Name": "Unmarshal", - "RecvType": "", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/yaml.go", - "Offset": 2757, - "Line": 80, - "Column": 6 - }, - "CallSites": [ - { - "Parent": 5, - "Name": "Unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/workspaces/govulncheck-action/pkg/yaml/testcase.go", - "Offset": 348, - "Line": 28, - "Column": 20 - }, - "Resolved": true - } - ] - }, - "9": { - "ID": 9, - "Name": "unmarshal", - "RecvType": "*gopkg.in/yaml.v2.decoder", - "PkgPath": "gopkg.in/yaml.v2", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 7403, - "Line": 317, - "Column": 19 - }, - "CallSites": [ - { - "Parent": 19, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/yaml.go", - "Offset": 4635, - "Line": 148, - "Column": 14 - }, - "Resolved": true - }, - { - "Parent": 20, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 17888, - "Line": 747, - "Column": 14 - }, - "Resolved": true - }, - { - "Parent": 20, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 18019, - "Line": 753, - "Column": 14 - }, - "Resolved": true - }, - { - "Parent": 20, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 18376, - "Line": 766, - "Column": 15 - }, - "Resolved": true - }, - { - "Parent": 21, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 16766, - "Line": 708, - "Column": 18 - }, - "Resolved": true - }, - { - "Parent": 21, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 17240, - "Line": 725, - "Column": 15 - }, - "Resolved": true - }, - { - "Parent": 21, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 17440, - "Line": 731, - "Column": 15 - }, - "Resolved": true - }, - { - "Parent": 23, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 15899, - "Line": 670, - "Column": 17 - }, - "Resolved": true - }, - { - "Parent": 23, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 15981, - "Line": 672, - "Column": 18 - }, - "Resolved": true - }, - { - "Parent": 22, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 14804, - "Line": 625, - "Column": 17 - }, - "Resolved": true - }, - { - "Parent": 22, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 15071, - "Line": 634, - "Column": 18 - }, - "Resolved": true - }, - { - "Parent": 24, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 8020, - "Line": 344, - "Column": 14 - }, - "Resolved": true - }, - { - "Parent": 25, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 13659, - "Line": 567, - "Column": 23 - }, - "Resolved": true - }, - { - "Parent": 26, - "Name": "unmarshal", - "RecvType": "", - "Pos": { - "Filename": "/go/pkg/mod/gopkg.in/yaml.v2@v2.2.0/decode.go", - "Offset": 8321, - "Line": 356, - "Column": 20 - }, - "Resolved": true - } - ] - } - }, - "Entries": [ - 1, - 2, - 3, - 4, - 5 - ] - }, - "Imports": { - "Packages": { - "1": { - "ID": 1, - "Name": "gjson", - "Path": "github.com/tidwall/gjson", - "Module": 1, - "ImportedBy": [ - 2, - 4 - ] - }, - "2": { - "ID": 2, - "Name": "json", - "Path": "github.com/Templum/playground/pkg/json", - "Module": 2, - "ImportedBy": [ - 8 - ] - }, - "3": { - "ID": 3, - "Name": "language", - "Path": "golang.org/x/text/language", - "Module": 3, - "ImportedBy": [ - 4, - 5, - 8 - ] - }, - "4": { - "ID": 4, - "Name": "seconds", - "Path": "github.com/Templum/playground/pkg/seconds", - "Module": 2, - "ImportedBy": [ - 8 - ] - }, - "5": { - "ID": 5, - "Name": "text", - "Path": "github.com/Templum/playground/pkg/text", - "Module": 2, - "ImportedBy": [ - 8 - ] - }, - "6": { - "ID": 6, - "Name": "yaml", - "Path": "gopkg.in/yaml.v2", - "Module": 4, - "ImportedBy": [ - 7 - ] - }, - "7": { - "ID": 7, - "Name": "yaml", - "Path": "github.com/Templum/playground/pkg/yaml", - "Module": 2, - "ImportedBy": [ - 8 - ] - }, - "8": { - "ID": 8, - "Name": "main", - "Path": "github.com/Templum/playground", - "Module": 2, - "ImportedBy": null - } - }, - "Entries": [ - 8, - 2, - 4, - 5, - 7 - ] - }, - "Requires": { - "Modules": { - "1": { - "ID": 1, - "Path": "github.com/tidwall/gjson", - "Version": "v1.6.4", - "Replace": 0, - "RequiredBy": [ - 2 - ] - }, - "2": { - "ID": 2, - "Path": "github.com/Templum/playground", - "Version": "", - "Replace": 0, - "RequiredBy": null - }, - "3": { - "ID": 3, - "Path": "golang.org/x/text", - "Version": "v0.3.6", - "Replace": 0, - "RequiredBy": [ - 2 - ] - }, - "4": { - "ID": 4, - "Path": "gopkg.in/yaml.v2", - "Version": "v2.2.0", - "Replace": 0, - "RequiredBy": [ - 2 - ] - } - }, - "Entries": [ - 2 - ] - }, - "Vulns": [ - { - "OSV": { - "id": "GO-2022-0957", - "published": "2022-08-25T06:28:20Z", - "modified": "2022-08-29T16:50:59Z", - "aliases": [ - "CVE-2020-36066", - "GHSA-wjm3-fq3r-5x46" - ], - "details": "A maliciously crafted JSON input can cause a denial of service attack.", - "affected": [ - { - "package": { - "name": "github.com/tidwall/gjson", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "1.6.5" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2022-0957" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "github.com/tidwall/gjson", - "symbols": [ - "Get", - "GetBytes", - "GetMany", - "GetManyBytes", - "Result.Get", - "parseObject", - "queryMatches" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/tidwall/match/commit/c2f534168b739a7ec1821a33839fb2f029f26bbc" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/commit/9f58baa7a613f89dfdc764c39e47fd3a15606153" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/195" - } - ] - }, - "Symbol": "Get", - "PkgPath": "github.com/tidwall/gjson", - "ModPath": "github.com/tidwall/gjson", - "CallSink": 12, - "ImportSink": 1, - "RequireSink": 1 - }, - { - "OSV": { - "id": "GO-2022-0957", - "published": "2022-08-25T06:28:20Z", - "modified": "2022-08-29T16:50:59Z", - "aliases": [ - "CVE-2020-36066", - "GHSA-wjm3-fq3r-5x46" - ], - "details": "A maliciously crafted JSON input can cause a denial of service attack.", - "affected": [ - { - "package": { - "name": "github.com/tidwall/gjson", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "1.6.5" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2022-0957" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "github.com/tidwall/gjson", - "symbols": [ - "Get", - "GetBytes", - "GetMany", - "GetManyBytes", - "Result.Get", - "parseObject", - "queryMatches" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/tidwall/match/commit/c2f534168b739a7ec1821a33839fb2f029f26bbc" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/commit/9f58baa7a613f89dfdc764c39e47fd3a15606153" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/195" - } - ] - }, - "Symbol": "Result.Get", - "PkgPath": "github.com/tidwall/gjson", - "ModPath": "github.com/tidwall/gjson", - "CallSink": 7, - "ImportSink": 1, - "RequireSink": 1 - }, - { - "OSV": { - "id": "GO-2022-0957", - "published": "2022-08-25T06:28:20Z", - "modified": "2022-08-29T16:50:59Z", - "aliases": [ - "CVE-2020-36066", - "GHSA-wjm3-fq3r-5x46" - ], - "details": "A maliciously crafted JSON input can cause a denial of service attack.", - "affected": [ - { - "package": { - "name": "github.com/tidwall/gjson", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "1.6.5" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2022-0957" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "github.com/tidwall/gjson", - "symbols": [ - "Get", - "GetBytes", - "GetMany", - "GetManyBytes", - "Result.Get", - "parseObject", - "queryMatches" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/tidwall/match/commit/c2f534168b739a7ec1821a33839fb2f029f26bbc" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/commit/9f58baa7a613f89dfdc764c39e47fd3a15606153" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/195" - } - ] - }, - "Symbol": "parseObject", - "PkgPath": "github.com/tidwall/gjson", - "ModPath": "github.com/tidwall/gjson", - "CallSink": 16, - "ImportSink": 1, - "RequireSink": 1 - }, - { - "OSV": { - "id": "GO-2022-0957", - "published": "2022-08-25T06:28:20Z", - "modified": "2022-08-29T16:50:59Z", - "aliases": [ - "CVE-2020-36066", - "GHSA-wjm3-fq3r-5x46" - ], - "details": "A maliciously crafted JSON input can cause a denial of service attack.", - "affected": [ - { - "package": { - "name": "github.com/tidwall/gjson", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "1.6.5" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2022-0957" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "github.com/tidwall/gjson", - "symbols": [ - "Get", - "GetBytes", - "GetMany", - "GetManyBytes", - "Result.Get", - "parseObject", - "queryMatches" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/tidwall/match/commit/c2f534168b739a7ec1821a33839fb2f029f26bbc" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/commit/9f58baa7a613f89dfdc764c39e47fd3a15606153" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/195" - } - ] - }, - "Symbol": "queryMatches", - "PkgPath": "github.com/tidwall/gjson", - "ModPath": "github.com/tidwall/gjson", - "CallSink": 15, - "ImportSink": 1, - "RequireSink": 1 - }, - { - "OSV": { - "id": "GO-2022-0956", - "published": "2022-08-29T22:15:46Z", - "modified": "2022-08-30T18:28:49Z", - "aliases": [ - "CVE-2022-3064" - ], - "details": "Parsing malicious or large YAML documents can consume excessive amounts of\nCPU or memory.\n", - "affected": [ - { - "package": { - "name": "gopkg.in/yaml.v2", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "2.2.4" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2022-0956" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "gopkg.in/yaml.v2", - "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "decoder.unmarshal", - "yaml_parser_increase_flow_level", - "yaml_parser_roll_indent" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/go-yaml/yaml/commit/f221b8435cfb71e54062f6c6e99e9ade30b124d5" - }, - { - "type": "WEB", - "url": "https://github.com/go-yaml/yaml/releases/tag/v2.2.4" - } - ] - }, - "Symbol": "Unmarshal", - "PkgPath": "gopkg.in/yaml.v2", - "ModPath": "gopkg.in/yaml.v2", - "CallSink": 8, - "ImportSink": 6, - "RequireSink": 4 - }, - { - "OSV": { - "id": "GO-2022-0956", - "published": "2022-08-29T22:15:46Z", - "modified": "2022-08-30T18:28:49Z", - "aliases": [ - "CVE-2022-3064" - ], - "details": "Parsing malicious or large YAML documents can consume excessive amounts of\nCPU or memory.\n", - "affected": [ - { - "package": { - "name": "gopkg.in/yaml.v2", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "2.2.4" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2022-0956" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "gopkg.in/yaml.v2", - "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "decoder.unmarshal", - "yaml_parser_increase_flow_level", - "yaml_parser_roll_indent" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/go-yaml/yaml/commit/f221b8435cfb71e54062f6c6e99e9ade30b124d5" - }, - { - "type": "WEB", - "url": "https://github.com/go-yaml/yaml/releases/tag/v2.2.4" - } - ] - }, - "Symbol": "yaml_parser_roll_indent", - "PkgPath": "gopkg.in/yaml.v2", - "ModPath": "gopkg.in/yaml.v2", - "CallSink": 10, - "ImportSink": 6, - "RequireSink": 4 - }, - { - "OSV": { - "id": "GO-2022-0956", - "published": "2022-08-29T22:15:46Z", - "modified": "2022-08-30T18:28:49Z", - "aliases": [ - "CVE-2022-3064" - ], - "details": "Parsing malicious or large YAML documents can consume excessive amounts of\nCPU or memory.\n", - "affected": [ - { - "package": { - "name": "gopkg.in/yaml.v2", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "2.2.4" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2022-0956" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "gopkg.in/yaml.v2", - "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "decoder.unmarshal", - "yaml_parser_increase_flow_level", - "yaml_parser_roll_indent" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/go-yaml/yaml/commit/f221b8435cfb71e54062f6c6e99e9ade30b124d5" - }, - { - "type": "WEB", - "url": "https://github.com/go-yaml/yaml/releases/tag/v2.2.4" - } - ] - }, - "Symbol": "yaml_parser_increase_flow_level", - "PkgPath": "gopkg.in/yaml.v2", - "ModPath": "gopkg.in/yaml.v2", - "CallSink": 13, - "ImportSink": 6, - "RequireSink": 4 - }, - { - "OSV": { - "id": "GO-2022-0956", - "published": "2022-08-29T22:15:46Z", - "modified": "2022-08-30T18:28:49Z", - "aliases": [ - "CVE-2022-3064" - ], - "details": "Parsing malicious or large YAML documents can consume excessive amounts of\nCPU or memory.\n", - "affected": [ - { - "package": { - "name": "gopkg.in/yaml.v2", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "2.2.4" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2022-0956" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "gopkg.in/yaml.v2", - "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "decoder.unmarshal", - "yaml_parser_increase_flow_level", - "yaml_parser_roll_indent" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/go-yaml/yaml/commit/f221b8435cfb71e54062f6c6e99e9ade30b124d5" - }, - { - "type": "WEB", - "url": "https://github.com/go-yaml/yaml/releases/tag/v2.2.4" - } - ] - }, - "Symbol": "decoder.unmarshal", - "PkgPath": "gopkg.in/yaml.v2", - "ModPath": "gopkg.in/yaml.v2", - "CallSink": 9, - "ImportSink": 6, - "RequireSink": 4 - }, + "Vulns": [ { "OSV": { - "id": "GO-2021-0265", - "published": "2022-08-15T18:06:07Z", - "modified": "2022-08-29T16:50:59Z", + "id": "GO-2022-1095", + "published": "2022-11-01T23:55:57Z", + "modified": "2022-11-01T23:55:57Z", "aliases": [ - "CVE-2021-42248", - "CVE-2021-42836", - "GHSA-c9gm-7rfj-8w5h", - "GHSA-ppj4-34rq-v8j9" + "CVE-2022-41716" ], - "details": "A maliciously crafted path can cause Get and other query functions\nto consume excessive amounts of CPU and time.\n", + "details": "Due to unsanitized NUL values, attackers may be able to maliciously set environment variables on Windows.\n\nIn syscall.StartProcess and os/exec.Cmd, invalid environment variable values containing NUL values are not properly checked for. A malicious environment variable value can exploit this behavior to set a value for a different environment variable. For example, the environment variable string \"A=B\\x00C=D\" sets the variables \"A=B\" and \"C=D\".", "affected": [ { "package": { - "name": "github.com/tidwall/gjson", + "name": "stdlib", "ecosystem": "Go" }, "ranges": [ @@ -3531,104 +23,45 @@ "introduced": "0" }, { - "fixed": "1.9.3" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0265" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "github.com/tidwall/gjson", - "symbols": [ - "Get", - "GetBytes", - "GetMany", - "GetManyBytes", - "Result.Get", - "parseObject", - "queryMatches" - ] - } - ] - } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://github.com/tidwall/gjson/commit/77a57fda87dca6d0d7d4627d512a630f89a91c96" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/237" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/236" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/commit/590010fdac311cc8990ef5c97448d4fec8f29944" - } - ] - }, - "Symbol": "Result.Get", - "PkgPath": "github.com/tidwall/gjson", - "ModPath": "github.com/tidwall/gjson", - "CallSink": 7, - "ImportSink": 1, - "RequireSink": 1 - }, - { - "OSV": { - "id": "GO-2021-0265", - "published": "2022-08-15T18:06:07Z", - "modified": "2022-08-29T16:50:59Z", - "aliases": [ - "CVE-2021-42248", - "CVE-2021-42836", - "GHSA-c9gm-7rfj-8w5h", - "GHSA-ppj4-34rq-v8j9" - ], - "details": "A maliciously crafted path can cause Get and other query functions\nto consume excessive amounts of CPU and time.\n", - "affected": [ - { - "package": { - "name": "github.com/tidwall/gjson", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ + "fixed": "1.18.8" + }, { - "introduced": "0" + "introduced": "1.19.0" }, { - "fixed": "1.9.3" + "fixed": "1.19.3" } ] } ], "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0265" + "url": "https://pkg.go.dev/vuln/GO-2022-1095" }, "ecosystem_specific": { "imports": [ { - "path": "github.com/tidwall/gjson", + "path": "syscall", + "goos": [ + "windows" + ], "symbols": [ - "Get", - "GetBytes", - "GetMany", - "GetManyBytes", - "Result.Get", - "parseObject", - "queryMatches" + "StartProcess" + ] + }, + { + "path": "os/exec", + "goos": [ + "windows" + ], + "symbols": [ + "Cmd.CombinedOutput", + "Cmd.Environ", + "Cmd.Output", + "Cmd.Run", + "Cmd.Start", + "Cmd.environ", + "dedupEnv", + "dedupEnvCase" ] } ] @@ -3637,46 +70,52 @@ ], "references": [ { - "type": "FIX", - "url": "https://github.com/tidwall/gjson/commit/77a57fda87dca6d0d7d4627d512a630f89a91c96" + "type": "REPORT", + "url": "https://go.dev/issue/56284" }, { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/237" + "type": "FIX", + "url": "https://go.dev/cl/446916" }, { "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/236" - }, + "url": "https://groups.google.com/g/golang-announce/c/mbHY1UY3BaM/m/hSpmRzk-AgAJ" + } + ], + "credits": [ { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/commit/590010fdac311cc8990ef5c97448d4fec8f29944" + "name": "RyotaK (https://twitter.com/ryotkak)" } ] }, - "Symbol": "parseObject", - "PkgPath": "github.com/tidwall/gjson", - "ModPath": "github.com/tidwall/gjson", - "CallSink": 16, - "ImportSink": 1, - "RequireSink": 1 + "Modules": [ + { + "Path": "stdlib", + "FoundVersion": "go1.19.2", + "FixedVersion": "go1.19.3", + "Packages": [ + { + "Path": "syscall", + "CallStacks": null + } + ] + } + ] }, { "OSV": { - "id": "GO-2021-0265", - "published": "2022-08-15T18:06:07Z", - "modified": "2022-08-29T16:50:59Z", + "id": "GO-2022-1059", + "published": "2022-10-11T18:16:24Z", + "modified": "2022-11-01T16:41:19Z", "aliases": [ - "CVE-2021-42248", - "CVE-2021-42836", - "GHSA-c9gm-7rfj-8w5h", - "GHSA-ppj4-34rq-v8j9" + "CVE-2022-32149", + "GHSA-69ch-w2m2-3vjp" ], - "details": "A maliciously crafted path can cause Get and other query functions\nto consume excessive amounts of CPU and time.\n", + "details": "An attacker may cause a denial of service by crafting an Accept-Language header which ParseAcceptLanguage will take significant time to parse.", "affected": [ { "package": { - "name": "github.com/tidwall/gjson", + "name": "golang.org/x/text", "ecosystem": "Go" }, "ranges": [ @@ -3687,26 +126,21 @@ "introduced": "0" }, { - "fixed": "1.9.3" + "fixed": "0.3.8" } ] } ], "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0265" + "url": "https://pkg.go.dev/vuln/GO-2022-1059" }, "ecosystem_specific": { "imports": [ { - "path": "github.com/tidwall/gjson", + "path": "golang.org/x/text/language", "symbols": [ - "Get", - "GetBytes", - "GetMany", - "GetManyBytes", - "Result.Get", - "parseObject", - "queryMatches" + "MatchStrings", + "ParseAcceptLanguage" ] } ] @@ -3715,42 +149,48 @@ ], "references": [ { - "type": "FIX", - "url": "https://github.com/tidwall/gjson/commit/77a57fda87dca6d0d7d4627d512a630f89a91c96" + "type": "REPORT", + "url": "https://go.dev/issue/56152" }, { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/237" + "type": "FIX", + "url": "https://go.dev/cl/442235" }, { "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/236" - }, + "url": "https://groups.google.com/g/golang-announce/c/-hjNw559_tE/m/KlGTfid5CAAJ" + } + ], + "credits": [ { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/commit/590010fdac311cc8990ef5c97448d4fec8f29944" + "name": "Adam Korczynski (ADA Logics) and OSS-Fuzz" } ] }, - "Symbol": "queryMatches", - "PkgPath": "github.com/tidwall/gjson", - "ModPath": "github.com/tidwall/gjson", - "CallSink": 15, - "ImportSink": 1, - "RequireSink": 1 + "Modules": [ + { + "Path": "golang.org/x/text", + "FoundVersion": "v0.3.6", + "FixedVersion": "v0.3.8", + "Packages": [ + { + "Path": "golang.org/x/text/language", + "CallStacks": null + } + ] + } + ] }, { "OSV": { - "id": "GO-2021-0265", - "published": "2022-08-15T18:06:07Z", - "modified": "2022-08-29T16:50:59Z", + "id": "GO-2022-0957", + "published": "2022-08-25T06:28:20Z", + "modified": "2022-09-20T15:16:04Z", "aliases": [ - "CVE-2021-42248", - "CVE-2021-42836", - "GHSA-c9gm-7rfj-8w5h", - "GHSA-ppj4-34rq-v8j9" + "CVE-2020-36066", + "GHSA-wjm3-fq3r-5x46" ], - "details": "A maliciously crafted path can cause Get and other query functions\nto consume excessive amounts of CPU and time.\n", + "details": "A maliciously crafted JSON input can cause a denial of service attack.", "affected": [ { "package": { @@ -3765,13 +205,13 @@ "introduced": "0" }, { - "fixed": "1.9.3" + "fixed": "1.6.5" } ] } ], "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0265" + "url": "https://pkg.go.dev/vuln/GO-2022-0957" }, "ecosystem_specific": { "imports": [ @@ -3794,106 +234,74 @@ "references": [ { "type": "FIX", - "url": "https://github.com/tidwall/gjson/commit/77a57fda87dca6d0d7d4627d512a630f89a91c96" - }, - { - "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/237" + "url": "https://github.com/tidwall/match/commit/c2f534168b739a7ec1821a33839fb2f029f26bbc" }, { "type": "WEB", - "url": "https://github.com/tidwall/gjson/issues/236" + "url": "https://github.com/tidwall/gjson/commit/9f58baa7a613f89dfdc764c39e47fd3a15606153" }, { "type": "WEB", - "url": "https://github.com/tidwall/gjson/commit/590010fdac311cc8990ef5c97448d4fec8f29944" + "url": "https://github.com/tidwall/gjson/issues/195" } ] }, - "Symbol": "Get", - "PkgPath": "github.com/tidwall/gjson", - "ModPath": "github.com/tidwall/gjson", - "CallSink": 12, - "ImportSink": 1, - "RequireSink": 1 - }, - { - "OSV": { - "id": "GO-2021-0113", - "published": "2021-10-06T17:51:21Z", - "modified": "2022-08-29T16:50:59Z", - "aliases": [ - "CVE-2021-38561" - ], - "details": "Due to improper index calculation, an incorrectly formatted language tag can cause Parse\nto panic via an out of bounds read. If Parse is used to process untrusted user inputs,\nthis may be used as a vector for a denial of service attack.\n", - "affected": [ - { - "package": { - "name": "golang.org/x/text", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - }, - { - "fixed": "0.3.7" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0113" - }, - "ecosystem_specific": { - "imports": [ + "Modules": [ + { + "Path": "github.com/tidwall/gjson", + "FoundVersion": "v1.6.4", + "FixedVersion": "v1.6.5", + "Packages": [ + { + "Path": "github.com/tidwall/gjson", + "CallStacks": [ { - "path": "golang.org/x/text/language", - "symbols": [ - "MatchStrings", - "MustParse", - "Parse", - "ParseAcceptLanguage" + "Symbol": "Get", + "Summary": "pkg/seconds/mixer.go:15:18: github.com/Templum/playground/pkg/seconds.Testcase calls github.com/tidwall/gjson.Get", + "Frames": [ + { + "PkgPath": "github.com/Templum/playground/pkg/seconds", + "FuncName": "Testcase", + "RecvType": "", + "Position": { + "Filename": "/workspaces/playground/pkg/seconds/mixer.go", + "Offset": 257, + "Line": 15, + "Column": 18 + } + }, + { + "PkgPath": "github.com/tidwall/gjson", + "FuncName": "Get", + "RecvType": "", + "Position": { + "Filename": "", + "Offset": 0, + "Line": 0, + "Column": 0 + } + } ] } ] } - } - ], - "references": [ - { - "type": "FIX", - "url": "https://go.dev/cl/340830" - }, - { - "type": "FIX", - "url": "https://go.googlesource.com/text/+/383b2e75a7a4198c42f8f87833eefb772868a56f" - } - ] - }, - "Symbol": "MustParse", - "PkgPath": "golang.org/x/text/language", - "ModPath": "golang.org/x/text", - "CallSink": 14, - "ImportSink": 3, - "RequireSink": 3 + ] + } + ] }, { "OSV": { - "id": "GO-2021-0113", - "published": "2021-10-06T17:51:21Z", - "modified": "2022-08-29T16:50:59Z", + "id": "GO-2022-0956", + "published": "2022-08-29T22:15:46Z", + "modified": "2022-10-26T17:44:45Z", "aliases": [ - "CVE-2021-38561" + "CVE-2022-3064" ], - "details": "Due to improper index calculation, an incorrectly formatted language tag can cause Parse\nto panic via an out of bounds read. If Parse is used to process untrusted user inputs,\nthis may be used as a vector for a denial of service attack.\n", + "details": "Parsing malicious or large YAML documents can consume excessive amounts of CPU or memory.", "affected": [ { "package": { - "name": "golang.org/x/text", + "name": "gopkg.in/yaml.v2", "ecosystem": "Go" }, "ranges": [ @@ -3904,23 +312,25 @@ "introduced": "0" }, { - "fixed": "0.3.7" + "fixed": "2.2.4" } ] } ], "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0113" + "url": "https://pkg.go.dev/vuln/GO-2022-0956" }, "ecosystem_specific": { "imports": [ { - "path": "golang.org/x/text/language", + "path": "gopkg.in/yaml.v2", "symbols": [ - "MatchStrings", - "MustParse", - "Parse", - "ParseAcceptLanguage" + "Decoder.Decode", + "Unmarshal", + "UnmarshalStrict", + "decoder.unmarshal", + "yaml_parser_increase_flow_level", + "yaml_parser_roll_indent" ] } ] @@ -3930,34 +340,73 @@ "references": [ { "type": "FIX", - "url": "https://go.dev/cl/340830" + "url": "https://github.com/go-yaml/yaml/commit/f221b8435cfb71e54062f6c6e99e9ade30b124d5" }, { - "type": "FIX", - "url": "https://go.googlesource.com/text/+/383b2e75a7a4198c42f8f87833eefb772868a56f" + "type": "WEB", + "url": "https://github.com/go-yaml/yaml/releases/tag/v2.2.4" } ] }, - "Symbol": "Parse", - "PkgPath": "golang.org/x/text/language", - "ModPath": "golang.org/x/text", - "CallSink": 6, - "ImportSink": 3, - "RequireSink": 3 + "Modules": [ + { + "Path": "gopkg.in/yaml.v2", + "FoundVersion": "v2.2.0", + "FixedVersion": "v2.2.4", + "Packages": [ + { + "Path": "gopkg.in/yaml.v2", + "CallStacks": [ + { + "Symbol": "Unmarshal", + "Summary": "pkg/yaml/testcase.go:28:20: github.com/Templum/playground/pkg/yaml.Testcase calls gopkg.in/yaml.v2.Unmarshal", + "Frames": [ + { + "PkgPath": "github.com/Templum/playground/pkg/yaml", + "FuncName": "Testcase", + "RecvType": "", + "Position": { + "Filename": "/workspaces/playground/pkg/yaml/testcase.go", + "Offset": 348, + "Line": 28, + "Column": 20 + } + }, + { + "PkgPath": "gopkg.in/yaml.v2", + "FuncName": "Unmarshal", + "RecvType": "", + "Position": { + "Filename": "", + "Offset": 0, + "Line": 0, + "Column": 0 + } + } + ] + } + ] + } + ] + } + ] }, { "OSV": { - "id": "GO-2021-0061", - "published": "2021-04-14T20:04:52Z", - "modified": "2022-08-29T16:50:59Z", + "id": "GO-2021-0265", + "published": "2022-08-15T18:06:07Z", + "modified": "2022-10-26T17:44:45Z", "aliases": [ - "CVE-2021-4235" + "CVE-2021-42248", + "CVE-2021-42836", + "GHSA-c9gm-7rfj-8w5h", + "GHSA-ppj4-34rq-v8j9" ], - "details": "Due to unbounded alias chasing, a maliciously crafted YAML file\ncan cause the system to consume significant system resources. If\nparsing user input, this may be used as a denial of service vector.\n", + "details": "A maliciously crafted path can cause Get and other query functions to consume excessive amounts of CPU and time.", "affected": [ { "package": { - "name": "gopkg.in/yaml.v2", + "name": "github.com/tidwall/gjson", "ecosystem": "Go" }, "ranges": [ @@ -3968,31 +417,107 @@ "introduced": "0" }, { - "fixed": "2.2.3" + "fixed": "1.9.3" } ] } ], "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0061" + "url": "https://pkg.go.dev/vuln/GO-2021-0265" }, "ecosystem_specific": { "imports": [ { - "path": "gopkg.in/yaml.v2", + "path": "github.com/tidwall/gjson", "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "decoder.unmarshal" + "Get", + "GetBytes", + "GetMany", + "GetManyBytes", + "Result.Get", + "parseObject", + "queryMatches" ] } ] } + } + ], + "references": [ + { + "type": "FIX", + "url": "https://github.com/tidwall/gjson/commit/77a57fda87dca6d0d7d4627d512a630f89a91c96" + }, + { + "type": "WEB", + "url": "https://github.com/tidwall/gjson/issues/237" + }, + { + "type": "WEB", + "url": "https://github.com/tidwall/gjson/issues/236" }, + { + "type": "WEB", + "url": "https://github.com/tidwall/gjson/commit/590010fdac311cc8990ef5c97448d4fec8f29944" + } + ] + }, + "Modules": [ + { + "Path": "github.com/tidwall/gjson", + "FoundVersion": "v1.6.4", + "FixedVersion": "v1.9.3", + "Packages": [ + { + "Path": "github.com/tidwall/gjson", + "CallStacks": [ + { + "Symbol": "Get", + "Summary": "pkg/seconds/mixer.go:15:18: github.com/Templum/playground/pkg/seconds.Testcase calls github.com/tidwall/gjson.Get", + "Frames": [ + { + "PkgPath": "github.com/Templum/playground/pkg/seconds", + "FuncName": "Testcase", + "RecvType": "", + "Position": { + "Filename": "/workspaces/playground/pkg/seconds/mixer.go", + "Offset": 257, + "Line": 15, + "Column": 18 + } + }, + { + "PkgPath": "github.com/tidwall/gjson", + "FuncName": "Get", + "RecvType": "", + "Position": { + "Filename": "", + "Offset": 0, + "Line": 0, + "Column": 0 + } + } + ] + } + ] + } + ] + } + ] + }, + { + "OSV": { + "id": "GO-2021-0113", + "published": "2021-10-06T17:51:21Z", + "modified": "2022-10-26T17:44:45Z", + "aliases": [ + "CVE-2021-38561" + ], + "details": "Due to improper index calculation, an incorrectly formatted language tag can cause Parse to panic via an out of bounds read. If Parse is used to process untrusted user inputs, this may be used as a vector for a denial of service attack.", + "affected": [ { "package": { - "name": "github.com/go-yaml/yaml", + "name": "golang.org/x/text", "ecosystem": "Go" }, "ranges": [ @@ -4001,22 +526,25 @@ "events": [ { "introduced": "0" + }, + { + "fixed": "0.3.7" } ] } ], "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0061" + "url": "https://pkg.go.dev/vuln/GO-2021-0113" }, "ecosystem_specific": { "imports": [ { - "path": "github.com/go-yaml/yaml", + "path": "golang.org/x/text/language", "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "decoder.unmarshal" + "MatchStrings", + "MustParse", + "Parse", + "ParseAcceptLanguage" ] } ] @@ -4026,30 +554,71 @@ "references": [ { "type": "FIX", - "url": "https://github.com/go-yaml/yaml/pull/375" + "url": "https://go.dev/cl/340830" }, { "type": "FIX", - "url": "https://github.com/go-yaml/yaml/commit/bb4e33bf68bf89cad44d386192cbed201f35b241" + "url": "https://go.googlesource.com/text/+/383b2e75a7a4198c42f8f87833eefb772868a56f" + } + ], + "credits": [ + { + "name": "Guido Vranken" } ] }, - "Symbol": "decoder.unmarshal", - "PkgPath": "gopkg.in/yaml.v2", - "ModPath": "gopkg.in/yaml.v2", - "CallSink": 9, - "ImportSink": 6, - "RequireSink": 4 + "Modules": [ + { + "Path": "golang.org/x/text", + "FoundVersion": "v0.3.6", + "FixedVersion": "v0.3.7", + "Packages": [ + { + "Path": "golang.org/x/text/language", + "CallStacks": [ + { + "Symbol": "MustParse", + "Summary": "pkg/seconds/mixer.go:12:29: github.com/Templum/playground/pkg/seconds.Testcase calls golang.org/x/text/language.MustParse", + "Frames": [ + { + "PkgPath": "github.com/Templum/playground/pkg/seconds", + "FuncName": "Testcase", + "RecvType": "", + "Position": { + "Filename": "/workspaces/playground/pkg/seconds/mixer.go", + "Offset": 204, + "Line": 12, + "Column": 29 + } + }, + { + "PkgPath": "golang.org/x/text/language", + "FuncName": "MustParse", + "RecvType": "", + "Position": { + "Filename": "", + "Offset": 0, + "Line": 0, + "Column": 0 + } + } + ] + } + ] + } + ] + } + ] }, { "OSV": { "id": "GO-2021-0061", "published": "2021-04-14T20:04:52Z", - "modified": "2022-08-29T16:50:59Z", + "modified": "2022-10-26T17:44:45Z", "aliases": [ "CVE-2021-4235" ], - "details": "Due to unbounded alias chasing, a maliciously crafted YAML file\ncan cause the system to consume significant system resources. If\nparsing user input, this may be used as a denial of service vector.\n", + "details": "Due to unbounded alias chasing, a maliciously crafted YAML file can cause the system to consume significant system resources. If parsing user input, this may be used as a denial of service vector.", "affected": [ { "package": { @@ -4085,38 +654,6 @@ } ] } - }, - { - "package": { - "name": "github.com/go-yaml/yaml", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2021-0061" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "github.com/go-yaml/yaml", - "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "decoder.unmarshal" - ] - } - ] - } } ], "references": [ @@ -4128,29 +665,69 @@ "type": "FIX", "url": "https://github.com/go-yaml/yaml/commit/bb4e33bf68bf89cad44d386192cbed201f35b241" } + ], + "credits": [ + { + "name": "@simonferquel" + } ] }, - "Symbol": "Unmarshal", - "PkgPath": "gopkg.in/yaml.v2", - "ModPath": "gopkg.in/yaml.v2", - "CallSink": 8, - "ImportSink": 6, - "RequireSink": 4 + "Modules": [ + { + "Path": "gopkg.in/yaml.v2", + "FoundVersion": "v2.2.0", + "FixedVersion": "v2.2.3", + "Packages": [ + { + "Path": "gopkg.in/yaml.v2", + "CallStacks": [ + { + "Symbol": "Unmarshal", + "Summary": "pkg/yaml/testcase.go:28:20: github.com/Templum/playground/pkg/yaml.Testcase calls gopkg.in/yaml.v2.Unmarshal", + "Frames": [ + { + "PkgPath": "github.com/Templum/playground/pkg/yaml", + "FuncName": "Testcase", + "RecvType": "", + "Position": { + "Filename": "/workspaces/playground/pkg/yaml/testcase.go", + "Offset": 348, + "Line": 28, + "Column": 20 + } + }, + { + "PkgPath": "gopkg.in/yaml.v2", + "FuncName": "Unmarshal", + "RecvType": "", + "Position": { + "Filename": "", + "Offset": 0, + "Line": 0, + "Column": 0 + } + } + ] + } + ] + } + ] + } + ] }, { "OSV": { - "id": "GO-2020-0036", + "id": "GO-2021-0054", "published": "2021-04-14T20:04:52Z", - "modified": "2022-08-29T16:50:59Z", + "modified": "2022-10-26T17:44:45Z", "aliases": [ - "CVE-2019-11254", - "GHSA-wxc4-f4m6-wwqv" + "CVE-2020-36067" ], - "details": "Due to unbounded aliasing, a crafted YAML file can cause consumption\nof significant system resources. If parsing user supplied input, this\nmay be used as a denial of service vector.\n", + "details": "Due to improper bounds checking, maliciously crafted JSON objects can cause an out-of-bounds panic. If parsing user input, this may be used as a denial of service vector.", "affected": [ { "package": { - "name": "gopkg.in/yaml.v2", + "name": "github.com/tidwall/gjson", "ecosystem": "Go" }, "ranges": [ @@ -4161,55 +738,21 @@ "introduced": "0" }, { - "fixed": "2.2.8" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2020-0036" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "gopkg.in/yaml.v2", - "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "yaml_parser_fetch_more_tokens" - ] - } - ] - } - }, - { - "package": { - "name": "github.com/go-yaml/yaml", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" + "fixed": "1.6.6" } ] } ], "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2020-0036" + "url": "https://pkg.go.dev/vuln/GO-2021-0054" }, "ecosystem_specific": { "imports": [ { - "path": "github.com/go-yaml/yaml", + "path": "github.com/tidwall/gjson", "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "yaml_parser_fetch_more_tokens" + "Result.ForEach", + "unwrap" ] } ] @@ -4219,35 +762,43 @@ "references": [ { "type": "FIX", - "url": "https://github.com/go-yaml/yaml/pull/555" - }, - { - "type": "FIX", - "url": "https://github.com/go-yaml/yaml/commit/53403b58ad1b561927d19068c655246f2db79d48" + "url": "https://github.com/tidwall/gjson/commit/bf4efcb3c18d1825b2988603dea5909140a5302b" }, { "type": "WEB", - "url": "https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=18496" + "url": "https://github.com/tidwall/gjson/issues/196" + } + ], + "credits": [ + { + "name": "@toptotu" } ] }, - "Symbol": "yaml_parser_fetch_more_tokens", - "PkgPath": "gopkg.in/yaml.v2", - "ModPath": "gopkg.in/yaml.v2", - "CallSink": 11, - "ImportSink": 6, - "RequireSink": 4 + "Modules": [ + { + "Path": "github.com/tidwall/gjson", + "FoundVersion": "v1.6.4", + "FixedVersion": "v1.6.6", + "Packages": [ + { + "Path": "github.com/tidwall/gjson", + "CallStacks": null + } + ] + } + ] }, { "OSV": { "id": "GO-2020-0036", "published": "2021-04-14T20:04:52Z", - "modified": "2022-08-29T16:50:59Z", + "modified": "2022-10-26T17:44:45Z", "aliases": [ "CVE-2019-11254", "GHSA-wxc4-f4m6-wwqv" ], - "details": "Due to unbounded aliasing, a crafted YAML file can cause consumption\nof significant system resources. If parsing user supplied input, this\nmay be used as a denial of service vector.\n", + "details": "Due to unbounded aliasing, a crafted YAML file can cause consumption of significant system resources. If parsing user supplied input, this may be used as a denial of service vector.", "affected": [ { "package": { @@ -4283,38 +834,6 @@ } ] } - }, - { - "package": { - "name": "github.com/go-yaml/yaml", - "ecosystem": "Go" - }, - "ranges": [ - { - "type": "SEMVER", - "events": [ - { - "introduced": "0" - } - ] - } - ], - "database_specific": { - "url": "https://pkg.go.dev/vuln/GO-2020-0036" - }, - "ecosystem_specific": { - "imports": [ - { - "path": "github.com/go-yaml/yaml", - "symbols": [ - "Decoder.Decode", - "Unmarshal", - "UnmarshalStrict", - "yaml_parser_fetch_more_tokens" - ] - } - ] - } } ], "references": [ @@ -4332,56 +851,48 @@ } ] }, - "Symbol": "Unmarshal", - "PkgPath": "gopkg.in/yaml.v2", - "ModPath": "gopkg.in/yaml.v2", - "CallSink": 8, - "ImportSink": 6, - "RequireSink": 4 - } - ], - "Modules": [ - { - "Path": "github.com/Templum/playground", - "Version": "", - "Dir": "", - "Replace": null - }, - { - "Path": "github.com/tidwall/gjson", - "Version": "v1.6.4", - "Dir": "", - "Replace": null - }, - { - "Path": "github.com/tidwall/match", - "Version": "v1.0.1", - "Dir": "", - "Replace": null - }, - { - "Path": "github.com/tidwall/pretty", - "Version": "v1.0.2", - "Dir": "", - "Replace": null - }, - { - "Path": "golang.org/x/text", - "Version": "v0.3.6", - "Dir": "", - "Replace": null - }, - { - "Path": "gopkg.in/yaml.v2", - "Version": "v2.2.0", - "Dir": "", - "Replace": null - }, - { - "Path": "stdlib", - "Version": "v1.19.1", - "Dir": "", - "Replace": null + "Modules": [ + { + "Path": "gopkg.in/yaml.v2", + "FoundVersion": "v2.2.0", + "FixedVersion": "v2.2.8", + "Packages": [ + { + "Path": "gopkg.in/yaml.v2", + "CallStacks": [ + { + "Symbol": "Unmarshal", + "Summary": "pkg/yaml/testcase.go:28:20: github.com/Templum/playground/pkg/yaml.Testcase calls gopkg.in/yaml.v2.Unmarshal", + "Frames": [ + { + "PkgPath": "github.com/Templum/playground/pkg/yaml", + "FuncName": "Testcase", + "RecvType": "", + "Position": { + "Filename": "/workspaces/playground/pkg/yaml/testcase.go", + "Offset": 348, + "Line": 28, + "Column": 20 + } + }, + { + "PkgPath": "gopkg.in/yaml.v2", + "FuncName": "Unmarshal", + "RecvType": "", + "Position": { + "Filename": "", + "Offset": 0, + "Line": 0, + "Column": 0 + } + } + ] + } + ] + } + ] + } + ] } ] -} +} \ No newline at end of file diff --git a/main.go b/main.go index 596598a..2f687d7 100644 --- a/main.go +++ b/main.go @@ -4,7 +4,6 @@ import ( "os" "runtime" - "github.com/Templum/govulncheck-action/pkg/action" "github.com/Templum/govulncheck-action/pkg/github" "github.com/Templum/govulncheck-action/pkg/sarif" "github.com/Templum/govulncheck-action/pkg/vulncheck" @@ -23,7 +22,6 @@ func main() { github := github.NewSarifUploader(logger) reporter := sarif.NewSarifReporter(logger, workDir) scanner := vulncheck.NewScanner(logger, workDir) - processor := action.NewVulncheckProcessor(workDir) if os.Getenv("DEBUG") == "true" { zerolog.SetGlobalLevel(zerolog.DebugLevel) @@ -53,10 +51,7 @@ func main() { os.Exit(2) } - vulnerableStacks := vulncheck.Resolve(result) - vulnerableStacks = processor.RemoveDuplicates(vulnerableStacks) - - err = reporter.Convert(vulnerableStacks) + err = reporter.Convert(result) if err != nil { logger.Error().Err(err).Msg("Conversion of Scan yielded error") os.Exit(2) @@ -95,7 +90,7 @@ func main() { if os.Getenv("STRICT") == "true" { logger.Debug().Msg("Action is running in strict mode") - if len(vulnerableStacks) > 0 { + if len(result.Vulns) > 0 { logger.Info().Msg("Encountered at least one vulnerability while running in strict mode, will mark outcome as failed") os.Exit(2) } diff --git a/pkg/action/preprocessor.go b/pkg/action/preprocessor.go deleted file mode 100644 index d877883..0000000 --- a/pkg/action/preprocessor.go +++ /dev/null @@ -1,76 +0,0 @@ -package action - -import ( - "strings" - - "github.com/Templum/govulncheck-action/pkg/types" - "golang.org/x/vuln/vulncheck" -) - -type VulncheckProcessor struct { - workDir string -} - -func NewVulncheckProcessor(workDir string) *VulncheckProcessor { - return &VulncheckProcessor{ - workDir: workDir, - } -} - -func (p *VulncheckProcessor) RemoveDuplicates(vulnerableStacks types.VulnerableStacks) types.VulnerableStacks { - // Will hold all unique items and there stacks - uniqueVulnStacks := make(types.VulnerableStacks) - // Sometimes vulnerabilities are included for each affected symbol - lookupTable := make(map[string]map[string]bool) - - for vuln, stacks := range vulnerableStacks { - ref := findRef(vuln.OSV.ID, uniqueVulnStacks) - if ref == nil { - uniqueVulnStacks[vuln] = make([]vulncheck.CallStack, 0) - ref = vuln - } - - if _, ok := lookupTable[vuln.OSV.ID]; !ok { - lookupTable[vuln.OSV.ID] = make(map[string]bool) - } - - for _, current := range stacks { - entry := FindVulnerableCallSite(p.workDir, current) - - if entry.Function != nil && entry.Call != nil { - callLocation := entry.Call.Pos.String() - - if _, ok := lookupTable[vuln.OSV.ID][callLocation]; !ok { - lookupTable[vuln.OSV.ID][callLocation] = true - uniqueVulnStacks[ref] = append(uniqueVulnStacks[ref], current) - } - } - - } - } - - return uniqueVulnStacks -} - -func FindVulnerableCallSite(workDir string, stack vulncheck.CallStack) vulncheck.StackEntry { - // We start from the back as that is the entrypoint for the reported vulnerability - for i := range stack { - current := stack[len(stack)-1-i] - - if current.Call != nil && strings.Contains(current.Call.Pos.Filename, workDir) { - return current - } - } - - return vulncheck.StackEntry{Function: nil, Call: nil} -} - -func findRef(osvID string, lookup types.VulnerableStacks) *vulncheck.Vuln { - for key := range lookup { - if key.OSV.ID == osvID { - return key - } - } - - return nil -} diff --git a/pkg/action/preprocessor_test.go b/pkg/action/preprocessor_test.go deleted file mode 100644 index 500f8f5..0000000 --- a/pkg/action/preprocessor_test.go +++ /dev/null @@ -1,152 +0,0 @@ -package action - -import ( - "go/token" - "path" - "testing" - - "github.com/Templum/govulncheck-action/pkg/types" - helper "github.com/Templum/govulncheck-action/pkg/vulncheck" - "github.com/rs/zerolog" - "github.com/stretchr/testify/assert" - "golang.org/x/vuln/vulncheck" -) - -func TestFindVulnerableCallSite(t *testing.T) { - userCallSite := vulncheck.StackEntry{ - Function: &vulncheck.FuncNode{ - ID: 2, - Name: "Testcase", - RecvType: "", - PkgPath: "github.com/Templum/playground/pkg/json", - Pos: &token.Position{ - Filename: "/workspaces/unit/pkg/json/testcase.go", - Offset: 130, - Line: 10, - Column: 6, - }, - CallSites: []*vulncheck.CallSite{}, // Not needed for this function - }, - Call: &vulncheck.CallSite{ - Parent: 2, - Name: "Get", - RecvType: "", - Resolved: true, - Pos: &token.Position{ - Filename: "/workspaces/unit/pkg/json/testcase.go", - Offset: 162, - Line: 11, - Column: 20, - }, - }, - } - - stack := []vulncheck.StackEntry{ - userCallSite, - { - Function: &vulncheck.FuncNode{ - ID: 12, - Name: "Get", - RecvType: "", - PkgPath: "github.com/tidwall/gjson", - Pos: &token.Position{ - Filename: "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - Offset: 37859, - Line: 1873, - Column: 6, - }, - CallSites: []*vulncheck.CallSite{}, // Not needed for this function - }, - Call: &vulncheck.CallSite{ - Parent: 12, - Name: "parseObject", - RecvType: "", - Resolved: true, - Pos: &token.Position{ - Filename: "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - Offset: 39894, - Line: 1963, - Column: 16, - }, - }, - }, - { - Function: &vulncheck.FuncNode{ - ID: 16, - Name: "parseObject", - RecvType: "", - PkgPath: "github.com/tidwall/gjson", - Pos: &token.Position{ - Filename: "/go/pkg/mod/github.com/tidwall/gjson@v1.6.4/gjson.go", - Offset: 21927, - Line: 1114, - Column: 2, - }, - CallSites: []*vulncheck.CallSite{}, // Not needed for this function - }, - Call: nil, - }, // Vulnerability - } - - t.Run("should return empty entry if nothing is found", func(t *testing.T) { - callSite := FindVulnerableCallSite("/workspaces/other", stack) - - assert.Nil(t, callSite.Call, "should have no call") - assert.Nil(t, callSite.Function, "should have no function") - }) - - t.Run("should return first calling site located in user code", func(t *testing.T) { - callSite := FindVulnerableCallSite("/workspaces/unit", stack) - - assert.NotNil(t, callSite.Call, "should have a call") - assert.NotNil(t, callSite.Function, "should have a function") - assert.Equal(t, userCallSite, callSite, "should find the correct call site") - }) -} - -func CalculateTotalFindings(input types.VulnerableStacks) int { - output := 0 - - for _, findings := range input { - output += len(findings) - } - - return output -} - -func TestVulncheckProcessor_RemoveDuplicates(t *testing.T) { - scanner := helper.NewLocalScanner(zerolog.Nop(), path.Join("..", "..", "hack", "found.json")) - result, _ := scanner.Scan() - input := helper.Resolve(result) - - hasDuplicateCallsites := make(types.VulnerableStacks) - hasDuplicateVuln := make(types.VulnerableStacks) - - for key, value := range input { - if key.OSV.ID == "GO-2021-0113" { - hasDuplicateVuln[key] = value - } - - if key.OSV.ID == "GO-2021-0061" && key.Symbol == "decoder.unmarshal" { - hasDuplicateCallsites[key] = value - } - } - - t.Run("should remove duplicates which are called from the same site", func(t *testing.T) { - target := NewVulncheckProcessor("/workspaces/govulncheck-action") - reduced := target.RemoveDuplicates(hasDuplicateCallsites) - - assert.NotNil(t, reduced, "should not be nil") - assert.Equal(t, len(reduced), len(hasDuplicateCallsites), "should have same amount of entries") - assert.Less(t, CalculateTotalFindings(reduced), CalculateTotalFindings(hasDuplicateCallsites), "reduced should be less after removal of duplicates") - }) - - t.Run("should remove duplicates which are for the same vulnerability", func(t *testing.T) { - target := NewVulncheckProcessor("/workspaces/govulncheck-action") - reduced := target.RemoveDuplicates(hasDuplicateVuln) - - assert.NotNil(t, reduced, "should not be nil") - assert.Less(t, len(reduced), len(hasDuplicateVuln), "should only have one entry now") - assert.Less(t, CalculateTotalFindings(reduced), CalculateTotalFindings(hasDuplicateVuln), "reduced should be less after removal of duplicates") - }) -} diff --git a/pkg/github/sarif_report_test.go b/pkg/github/sarif_report_test.go index 64042c8..752d6dd 100644 --- a/pkg/github/sarif_report_test.go +++ b/pkg/github/sarif_report_test.go @@ -27,7 +27,7 @@ type MockReport struct { mock.Mock } -func (m *MockReport) Convert(result types.VulnerableStacks) error { +func (m *MockReport) Convert(result *types.Result) error { args := m.Called(result) return args.Error(0) } diff --git a/pkg/sarif/reporter.go b/pkg/sarif/reporter.go index 885bab4..dc746a3 100644 --- a/pkg/sarif/reporter.go +++ b/pkg/sarif/reporter.go @@ -3,15 +3,12 @@ package sarif import ( "fmt" "io" - "os" "strings" - "github.com/Templum/govulncheck-action/pkg/action" "github.com/Templum/govulncheck-action/pkg/types" "github.com/owenrumney/go-sarif/v2/sarif" "github.com/rs/zerolog" "golang.org/x/vuln/osv" - "golang.org/x/vuln/vulncheck" ) const ( @@ -36,25 +33,30 @@ func NewSarifReporter(logger zerolog.Logger, workDir string) types.Reporter { return &SarifReporter{report: nil, run: nil, log: logger, workDir: workDir} } -func (sr *SarifReporter) Convert(result types.VulnerableStacks) error { +func (sr *SarifReporter) Convert(result *types.Result) error { sr.createEmptyReport("initial") - sr.log.Debug().Msgf("Scan showed code being impacted by %d vulnerabilities", len(result)) - for vuln, callStacks := range result { - sr.addRule(vuln) - - for _, current := range callStacks { - // callSite can never have Call=nil Function=nil as the curator is using - // the same method and filtering out those cases - callSite := action.FindVulnerableCallSite(sr.workDir, current) - - text, markdown := sr.generateResultMessage(vuln, callSite, current) - sr.addResult(vuln, callSite.Call, text, markdown) + sr.log.Debug().Msgf("Scan result shows the code is affected by %d vulnerabilities", len(result.Vulns)) + for _, vuln := range result.Vulns { + sr.addRule(vuln.Osv) + + for _, mods := range vuln.Modules { + for _, pkg := range mods.Packages { + if len(pkg.CallStacks) > 0 { + for _, callStack := range pkg.CallStacks { + // Vulnerable code is directly called + sr.addDirectCallResult(vuln.Osv.ID, pkg, callStack) + } + } else { + // Vulnerable code is direct or indirect imported + sr.addImportResult(vuln.Osv.ID, pkg) + } + } } } - sr.log.Info().Int("Vulnerabilities", len(result)).Int("Call Sites", len(sr.run.Results)).Msg("Conversion yielded following stats") + sr.log.Info().Int("Vulnerabilities", len(sr.run.Tool.Driver.Rules)).Int("Call Sites", len(sr.run.Results)).Msg("Conversion yielded following stats") return nil } @@ -76,14 +78,14 @@ func (sr *SarifReporter) createEmptyReport(vulncheckVersion string) { sr.run = run } -func (sr *SarifReporter) addRule(vuln *vulncheck.Vuln) { +func (sr *SarifReporter) addRule(vuln *osv.Entry) { text, markdown := sr.generateRuleHelp(vuln) // sr.run.AddRule does check if the rule is present prior to adding it - sr.run.AddRule(vuln.OSV.ID). + sr.run.AddRule(vuln.ID). WithName(ruleName). - WithDescription(vuln.OSV.ID). - WithFullDescription(sarif.NewMultiformatMessageString(vuln.OSV.Details)). + WithDescription(vuln.ID). + WithFullDescription(sarif.NewMultiformatMessageString(vuln.Details)). WithHelp(sarif.NewMultiformatMessageString(text).WithMarkdown(markdown)). WithDefaultConfiguration(sarif.NewReportingConfiguration().WithLevel(severity)). WithProperties(sarif.Properties{ @@ -94,40 +96,66 @@ func (sr *SarifReporter) addRule(vuln *vulncheck.Vuln) { "security", }, "precision": "very-high", - "aliases": vuln.OSV.Aliases, + "aliases": vuln.Aliases, }). - WithHelpURI(fmt.Sprintf("https://pkg.go.dev/vuln/%s", vuln.OSV.ID)) + WithHelpURI(fmt.Sprintf("https://pkg.go.dev/vuln/%s", vuln.ID)) } -func (sr *SarifReporter) addResult(vuln *vulncheck.Vuln, call *vulncheck.CallSite, text string, markdown string) { - result := sarif.NewRuleResult(vuln.OSV.ID). +func (sr *SarifReporter) addDirectCallResult(vulnID string, pkg *types.Package, callStack types.CallStack) { + entry := callStack.Frames[0] + + result := sarif.NewRuleResult(vulnID). WithLevel(severity). - WithMessage(sarif.NewMessage().WithMarkdown(markdown).WithText(text)) + WithMessage(sarif.NewMessage().WithText(callStack.Summary)) + + sr.log.Debug(). + Str("Symbol", callStack.Symbol). + Msgf("Adding a result for %s called from %s", vulnID, entry.Position) - if call != nil { - sr.log.Debug(). - Str("Symbol", vuln.Symbol). - Msgf("Add result for %s called from %s", vuln.OSV.ID, call.Pos) + region := sarif.NewRegion(). + WithStartLine(entry.Position.Line). + WithEndLine(entry.Position.Line). + WithStartColumn(entry.Position.Column). + WithEndColumn(entry.Position.Column). + WithCharOffset(entry.Position.Offset) - region := sarif.NewRegion(). - WithStartLine(call.Pos.Line). - WithEndLine(call.Pos.Line). - WithStartColumn(call.Pos.Column). - WithEndColumn(call.Pos.Column). - WithCharOffset(call.Pos.Offset) + location := sarif.NewPhysicalLocation(). + WithArtifactLocation(sarif.NewSimpleArtifactLocation(sr.makePathRelative(entry.Position.Filename)).WithUriBaseId(baseURI)). + WithRegion(region) - location := sarif.NewPhysicalLocation(). - WithArtifactLocation(sarif.NewSimpleArtifactLocation(sr.makePathRelative(call.Pos.Filename)).WithUriBaseId(baseURI)). - WithRegion(region) + result.WithLocations([]*sarif.Location{sarif.NewLocationWithPhysicalLocation(location)}) - result.WithLocations([]*sarif.Location{sarif.NewLocationWithPhysicalLocation(location)}) + if ruleIdx := sr.getRule(vulnID); ruleIdx >= 0 { + result.WithRuleIndex(ruleIdx) + sr.run.AddResult(result) } +} + +func (sr *SarifReporter) addImportResult(vulnID string, pkg *types.Package) { + message := fmt.Sprintf("Package %s is vulnerable to %s, but your code doesn't appear to call any vulnerable function directly. You may not need to take any action.", pkg.Path, vulnID) + + result := sarif.NewRuleResult(vulnID). + WithLevel(severity). + WithMessage(sarif.NewMessage().WithText(message).WithMarkdown(message)) + + sr.log.Debug(). + Str("Path", pkg.Path). + Msgf("Adding a result related to an import exposed to %s", vulnID) + + region := sarif.NewRegion(). + WithStartLine(0). + WithEndLine(0). + WithStartColumn(0). + WithEndColumn(0). + WithCharOffset(0) - // TODO: Research option to provide fix instructions - // result.Fixes = append(result.Fixes, sarif.NewFix().WithDescription(fmt.Sprintf("Was fixed with version %s"))) + location := sarif.NewPhysicalLocation(). + WithArtifactLocation(sarif.NewSimpleArtifactLocation("go.mod").WithUriBaseId(baseURI)). + WithRegion(region) - ruleIdx := sr.getRule(vuln.OSV.ID) - if ruleIdx >= 0 { + result.WithLocations([]*sarif.Location{sarif.NewLocationWithPhysicalLocation(location)}) + + if ruleIdx := sr.getRule(vulnID); ruleIdx >= 0 { result.WithRuleIndex(ruleIdx) sr.run.AddResult(result) } @@ -143,7 +171,8 @@ func (sr *SarifReporter) getRule(ruleId string) int { } func (sr *SarifReporter) makePathRelative(absolute string) string { - return strings.ReplaceAll(absolute, sr.workDir, "") + relative := strings.ReplaceAll(absolute, sr.workDir, "") + return strings.TrimPrefix(relative, "/") } func (sr *SarifReporter) searchFixVersion(versions []osv.Affected) string { @@ -160,41 +189,20 @@ func (sr *SarifReporter) searchFixVersion(versions []osv.Affected) string { return "None" } -func (sr *SarifReporter) generateRuleHelp(vuln *vulncheck.Vuln) (text string, markdown string) { - fixVersion := sr.searchFixVersion(vuln.OSV.Affected) - uri := fmt.Sprintf("https://pkg.go.dev/vuln/%s", vuln.OSV.ID) +func (sr *SarifReporter) searchPackage(versions []osv.Affected) string { + for _, current := range versions { + return current.Package.Name + } - return fmt.Sprintf("Vulnerability %s \n Module: %s \n Package: %s \n Fixed in Version: %s \n", vuln.OSV.ID, vuln.ModPath, vuln.PkgPath, fixVersion), - fmt.Sprintf("**Vulnerability [%s](%s)**\n%s\n| Module | Package | Fixed in Version |\n| --- | --- |:---:|\n|%s|%s|%s|\n", vuln.OSV.ID, uri, vuln.OSV.Details, vuln.ModPath, vuln.PkgPath, fixVersion) + return "N/A" } -func (sr *SarifReporter) generateResultMessage(vuln *vulncheck.Vuln, entry vulncheck.StackEntry, stack vulncheck.CallStack) (text string, markdown string) { - relativeFile := sr.makePathRelative(entry.Call.Pos.String()) - linkToFile := fmt.Sprintf("https://github.com/%s/blob/main/%s#L%d", os.Getenv(envRepo), sr.makePathRelative(entry.Call.Pos.Filename), entry.Call.Pos.Line) - linkToVuln := fmt.Sprintf("https://pkg.go.dev/vuln/%s", vuln.OSV.ID) +func (sr *SarifReporter) generateRuleHelp(vuln *osv.Entry) (text string, markdown string) { + fixVersion := sr.searchFixVersion(vuln.Affected) + pkg := sr.searchPackage(vuln.Affected) - var txtBuilder strings.Builder - var markBuilder strings.Builder - - txtBuilder.WriteString(fmt.Sprintf("%s calls %s which has vulnerability %s\n", - fmt.Sprintf("[%s] %s.%s", relativeFile, entry.Function.PkgPath, entry.Function.Name), - fmt.Sprintf("%s.%s", vuln.PkgPath, entry.Call.Name), - vuln.OSV.ID)) - txtBuilder.WriteString("Stacktrace: \n") - - markBuilder.WriteString(fmt.Sprintf("%s calls %s which has vulnerability [%s](%s)\n", - fmt.Sprintf("[%s](%s) %s.%s", relativeFile, linkToFile, entry.Function.PkgPath, entry.Function.Name), - fmt.Sprintf("%s.%s", vuln.PkgPath, entry.Call.Name), - vuln.OSV.ID, - linkToVuln, - )) - - markBuilder.WriteString("Stacktrace: \n") - - for _, line := range types.FormatCallStack(stack) { - txtBuilder.WriteString(fmt.Sprintf("%s \n", line)) - markBuilder.WriteString(fmt.Sprintf("* %s \n", line)) - } + uri := fmt.Sprintf("https://pkg.go.dev/vuln/%s", vuln.ID) - return txtBuilder.String(), markBuilder.String() + return fmt.Sprintf("Vulnerability %s \n Package: %s \n Fixed in Version: %s \n", vuln.ID, pkg, fixVersion), + fmt.Sprintf("**Vulnerability [%s](%s)**\n%s\n| Package | Fixed in Version |\n| --- |:---:|\n|%s|%s|\n", vuln.ID, uri, vuln.Details, pkg, fixVersion) } diff --git a/pkg/sarif/reporter_test.go b/pkg/sarif/reporter_test.go index fb4a42d..08a5cd7 100644 --- a/pkg/sarif/reporter_test.go +++ b/pkg/sarif/reporter_test.go @@ -7,7 +7,6 @@ import ( "path" "testing" - "github.com/Templum/govulncheck-action/pkg/action" "github.com/Templum/govulncheck-action/pkg/types" helper "github.com/Templum/govulncheck-action/pkg/vulncheck" "github.com/owenrumney/go-sarif/v2/sarif" @@ -17,22 +16,19 @@ import ( func TestSarifReporter_Convert(t *testing.T) { scanner := helper.NewLocalScanner(zerolog.Nop(), path.Join("..", "..", "hack", "found.json")) - preprocessor := action.NewVulncheckProcessor("/workspaces/govulncheck-action") result, _ := scanner.Scan() - input := helper.Resolve(result) - input = preprocessor.RemoveDuplicates(input) t.Run("Should convert a preprocessed report into sarif format", func(t *testing.T) { target := NewSarifReporter(zerolog.Nop(), "/workspaces/govulncheck-action") ref := target.(*SarifReporter) - _ = target.Convert(input) + _ = target.Convert(result) assert.NotNil(t, ref.report, "should have create an empty report") assert.NotNil(t, ref.run, "should have filled a run with details") - assert.GreaterOrEqual(t, len(ref.run.Results), 9, "example report should have 9 calls to vulnerabilities") - assert.GreaterOrEqual(t, len(ref.run.Tool.Driver.Rules), 6, "example report should have 6 vulnerabilities") + assert.Equal(t, len(ref.run.Results), 9, "example report should have 9 calls to vulnerabilities") + assert.Equal(t, len(ref.run.Tool.Driver.Rules), 9, "example report should have 9 vulnerabilities") assert.Equal(t, len(ref.report.Runs), 0, "should have not yet added the run to the report") }) @@ -40,7 +36,7 @@ func TestSarifReporter_Convert(t *testing.T) { target := NewSarifReporter(zerolog.Nop(), "/workspaces/govulncheck-action") ref := target.(*SarifReporter) - _ = target.Convert(make(types.VulnerableStacks)) + _ = target.Convert(&types.Result{Vulns: []types.Vulns{}}) assert.NotNil(t, ref.report, "should have create an empty report") assert.NotNil(t, ref.run, "should have filled a run with details") diff --git a/pkg/types/call_chain.go b/pkg/types/call_chain.go deleted file mode 100644 index 4ee046f..0000000 --- a/pkg/types/call_chain.go +++ /dev/null @@ -1,44 +0,0 @@ -package types - -import ( - "fmt" - - "golang.org/x/vuln/vulncheck" -) - -type CallChain struct { - Fn *vulncheck.FuncNode - Called *vulncheck.CallSite - Child *CallChain -} - -func NewCallChainLeave(fn *vulncheck.FuncNode, call *vulncheck.CallSite, child *CallChain) *CallChain { - return &CallChain{ - Fn: fn, - Called: call, - Child: child, - } -} - -func (c *CallChain) CreateCallStack() vulncheck.CallStack { - if c == nil { - return make(vulncheck.CallStack, 0) - } - - return append(vulncheck.CallStack{vulncheck.StackEntry{Function: c.Fn, Call: c.Called}}, c.Child.CreateCallStack()...) -} - -func FormatCallStack(stack vulncheck.CallStack) []string { - var output []string - - for i, current := range stack { - if current.Call == nil { - output = append(output, fmt.Sprintf("[%d] Vulnerability %s.%s", i, current.Function.PkgPath, current.Function.Name)) - } else { - output = append(output, fmt.Sprintf("[%d] %s %s => %s", i, current.Function.PkgPath, current.Function.Name, current.Call.Name)) - } - - } - - return output -} diff --git a/pkg/types/reporter.go b/pkg/types/reporter.go index 92a2def..085d07b 100644 --- a/pkg/types/reporter.go +++ b/pkg/types/reporter.go @@ -5,6 +5,6 @@ import ( ) type Reporter interface { - Convert(result VulnerableStacks) error + Convert(result *Result) error Write(dest io.Writer) error } diff --git a/pkg/types/result.go b/pkg/types/result.go index e22e3de..5de7313 100644 --- a/pkg/types/result.go +++ b/pkg/types/result.go @@ -1,5 +1,105 @@ package types -import "golang.org/x/vuln/vulncheck" +import ( + "go/token" -type VulnerableStacks map[*vulncheck.Vuln][]vulncheck.CallStack + "golang.org/x/vuln/osv" +) + +// Result links to: https://github.com/golang/vuln/blob/55c64d8e26b914d8703299302be4997b6de580d0/internal/govulncheck/result.go#L38 +type Result struct { + Vulns []Vulns +} + +type Vulns struct { + // OSV contains all data from the OSV entry for this vulnerability. + Osv *osv.Entry + // Modules contains all of the modules in the OSV entry where a + // vulnerable package is imported by the target source code or binary. + // + // For example, a module M with two packages M/p1 and M/p2, where only p1 + // is vulnerable, will appear in this list if and only if p1 is imported by + // the target source code or binary. + Modules []*Module +} + +type Module struct { + // Path is the module path of the module containing the vulnerability. + // + // Importable packages in the standard library will have the path "stdlib". + Path string + + // FoundVersion is the module version where the vulnerability was found. + FoundVersion string + + // FixedVersion is the module version where the vulnerability was + // fixed. If there are multiple fixed versions in the OSV report, this will + // be the latest fixed version. + // + // This is empty if a fix is not available. + FixedVersion string + + // Packages contains all the vulnerable packages in OSV entry that are + // imported by the target source code or binary. + // + // For example, given a module M with two packages M/p1 and M/p2, where + // both p1 and p2 are vulnerable, p1 and p2 will each only appear in this + // list they are individually imported by the target source code or binary. + Packages []*Package +} + +type Package struct { + // Path is the import path of the package containing the vulnerability. + Path string + + // CallStacks contains a representative call stack for each + // vulnerable symbol that is called. + // + // For vulnerabilities found from binary analysis, only CallStack.Symbol + // will be provided. + // + // For non-affecting vulnerabilities reported from the source mode + // analysis, this will be empty. + CallStacks []CallStack +} + +type CallStack struct { + // Symbol is the name of the detected vulnerable function + // or method. + // + // This follows the naming convention in the OSV report. + Symbol string + + // Summary is a one-line description of the callstack, used by the + // default govulncheck mode. + // + // Example: module3.main calls github.com/shiyanhui/dht.DHT.Run + Summary string + + // Frames contains an entry for each stack in the call stack. + // + // Frames are sorted starting from the entry point to the + // imported vulnerable symbol. The last frame in Frames should match + // Symbol. + Frames []*StackFrame +} + +type StackFrame struct { + // PackagePath is the import path. + PkgPath string + + // FuncName is the function name. + FuncName string + + // RecvType is the fully qualified receiver type, + // if the called symbol is a method. + // + // The client can create the final symbol name by + // prepending RecvType to FuncName. + RecvType string + + // Position describes an arbitrary source position + // including the file, line, and column location. + // A Position is valid if the line number is > 0. + Position token.Position +} diff --git a/pkg/vulncheck/resolver.go b/pkg/vulncheck/resolver.go deleted file mode 100644 index 4e68632..0000000 --- a/pkg/vulncheck/resolver.go +++ /dev/null @@ -1,177 +0,0 @@ -package vulncheck - -import ( - "container/list" - "sort" - "strings" - "sync" - - "github.com/Templum/govulncheck-action/pkg/types" - "golang.org/x/vuln/vulncheck" -) - -// Resolve is based on code from the vuln package, which is released under BSD-style license: https://github.com/golang/vuln/blob/cac67f5c7c815b458cf683c41541d157d8217beb/vulncheck/witness.go#L146-L168 -// Resolve will collect all callstacks related to a vulnerability -// This occurs in parallel with one goroutine per vulnerability -func Resolve(result *vulncheck.Result) types.VulnerableStacks { - var ( - wg sync.WaitGroup - mu sync.Mutex - ) - vulnLookup := make(types.VulnerableStacks) - for _, current := range result.Vulns { - wg.Add(1) - go func(vulnerability *vulncheck.Vuln) { - var cs []vulncheck.CallStack - if vulnerability.CallSink != 0 { - cs = resolveCallstacks(vulnerability.CallSink, result) - } - - // sort call stacks by the estimated value to the user - sort.Slice(cs, func(i, j int) bool { - return stackLess(cs[i], cs[j]) - }) - - mu.Lock() - vulnLookup[vulnerability] = cs - mu.Unlock() - wg.Done() - }(current) - } - wg.Wait() - return vulnLookup -} - -// searchUnvisitedCallSites is based on code from the vuln package, which is released under BSD-style license: https://github.com/golang/vuln/blob/cac67f5c7c815b458cf683c41541d157d8217beb/vulncheck/witness.go#L172-L211 -// resolveCallstacks fetches all callstacks based on the provided entrypoint -func resolveCallstacks(entryID int, result *vulncheck.Result) []vulncheck.CallStack { - visitedSites := make(map[int]bool) - - vulEntryPoints := make(map[int]bool) - for _, current := range result.Calls.Entries { - vulEntryPoints[current] = true - } - - var stacks []vulncheck.CallStack - - queue := list.New() - queue.PushBack(types.NewCallChainLeave(result.Calls.Functions[entryID], nil, nil)) - - for queue.Len() > 0 { - ref := queue.Front() - current := ref.Value.(*types.CallChain) - queue.Remove(ref) - - if visitedSites[current.Fn.ID] { - continue - } - visitedSites[current.Fn.ID] = true - - for _, cs := range searchUnvisitedCallSites(current.Fn.CallSites, visitedSites, result) { - caller := result.Calls.Functions[cs.Parent] - chain := types.NewCallChainLeave(caller, cs, current) - - if vulEntryPoints[caller.ID] { - stacks = append(stacks, chain.CreateCallStack()) - } - - queue.PushBack(chain) - } - } - - return stacks -} - -// searchUnvisitedCallSites is based on code from the vuln package, which is released under BSD-style license: https://github.com/golang/vuln/blob/cac67f5c7c815b458cf683c41541d157d8217beb/vulncheck/witness.go#L217-L239 -// searchUnvisitedCallSites will go through the provided input and checkout the parent, while ensuring previously visited sites are not visited again -// It finally returns a list of all new callsites based on input -func searchUnvisitedCallSites(input []*vulncheck.CallSite, visitedSites map[int]bool, result *vulncheck.Result) []*vulncheck.CallSite { - callSites := make(map[int]*vulncheck.CallSite) - for _, cs := range input { - if visitedSites[cs.Parent] { - continue - } - - callSites[cs.Parent] = cs - } - - var functions []*vulncheck.FuncNode - for id := range callSites { - functions = append(functions, result.Calls.Functions[id]) - } - - var unvisitedSites []*vulncheck.CallSite - for _, fn := range functions { - unvisitedSites = append(unvisitedSites, callSites[fn.ID]) - } - - return unvisitedSites -} - -// confidence was taken directly from the vuln package, which is released under BSD-style license: https://github.com/golang/vuln/blob/cac67f5c7c815b458cf683c41541d157d8217beb/vulncheck/witness.go#L302-L320 -// stackLess compares two call stacks in terms of their estimated -// value to the user. Shorter stacks generally come earlier in the ordering. -// -// Two stacks are lexicographically ordered by: -// 1) their estimated level of confidence in being a real call stack, -// 2) their length, and 3) the number of dynamic call sites in the stack. -func stackLess(left vulncheck.CallStack, right vulncheck.CallStack) bool { - if c1, c2 := confidence(left), confidence(right); c1 != c2 { - return c1 < c2 - } - - if len(left) != len(right) { - return len(left) < len(right) - } - - if w1, w2 := weight(left), weight(right); w1 != w2 { - return w1 < w2 - } - - return true -} - -// confidence was taken directly from the vuln package, which is released under BSD-style license: https://github.com/golang/vuln/blob/cac67f5c7c815b458cf683c41541d157d8217beb/vulncheck/witness.go#L286-L294 -// confidence computes an approximate measure of whether the stack -// is realizable in practice. Currently, it equals the number of call -// sites in stack that go through standard libraries. Such call stacks -// have been experimentally shown to often result in false positives. -func confidence(stack vulncheck.CallStack) int { - c := 0 - for _, e := range stack { - if isStdPackage(e.Function.PkgPath) { - c += 1 - } - } - return c -} - -// weight was taken directly from the vuln package, which is released under BSD-style license: https://github.com/golang/vuln/blob/cac67f5c7c815b458cf683c41541d157d8217beb/vulncheck/witness.go#L270-L280 -// isStdPackage checks if the provided pkg is a standard package -func isStdPackage(pkg string) bool { - if pkg == "" { - return false - } - // std packages do not have a "." in their path. For instance, see - // Contains in pkgsite/+/refs/heads/master/internal/stdlbib/stdlib.go. - if i := strings.IndexByte(pkg, '/'); i != -1 { - pkg = pkg[:i] - } - return !strings.Contains(pkg, ".") -} - -// weight was taken directly from the vuln package, which is released under BSD-style license: https://github.com/golang/vuln/blob/cac67f5c7c815b458cf683c41541d157d8217beb/vulncheck/witness.go#L260-L268 -// weight computes an approximate measure of how easy is to understand the call -// stack when presented to the client as a witness. The smaller the value, the more -// understandable the stack is. Currently defined as the number of unresolved -// call sites in the stack. -func weight(stack vulncheck.CallStack) int { - // - w := 0 - for _, e := range stack { - if e.Call != nil && !e.Call.Resolved { - w += 1 - } - } - return w -} diff --git a/pkg/vulncheck/runner.go b/pkg/vulncheck/runner.go index 3093f0d..8d988a7 100644 --- a/pkg/vulncheck/runner.go +++ b/pkg/vulncheck/runner.go @@ -6,8 +6,8 @@ import ( "os" "os/exec" + "github.com/Templum/govulncheck-action/pkg/types" "github.com/rs/zerolog" - "golang.org/x/vuln/vulncheck" ) const ( @@ -17,7 +17,7 @@ const ( ) type Scanner interface { - Scan() (*vulncheck.Result, error) + Scan() (*types.Result, error) } type CmdScanner struct { @@ -29,7 +29,7 @@ func NewScanner(logger zerolog.Logger, workDir string) Scanner { return &CmdScanner{log: logger, workDir: workDir} } -func (r *CmdScanner) Scan() (*vulncheck.Result, error) { +func (r *CmdScanner) Scan() (*types.Result, error) { pkg := os.Getenv(envPackage) r.log.Info().Msgf("Running govulncheck for package %s in dir %s", pkg, r.workDir) @@ -49,7 +49,7 @@ func (r *CmdScanner) Scan() (*vulncheck.Result, error) { return nil, cmdErr } - var result vulncheck.Result + var result types.Result err := json.Unmarshal(out, &result) if err != nil { r.log.Error().Err(err).Msg("parsing govulncheck output yielded error") @@ -57,5 +57,25 @@ func (r *CmdScanner) Scan() (*vulncheck.Result, error) { } r.log.Info().Msg("Successfully scanned project") + + if os.Getenv("DEBUG") == "true" { + fileName := "raw-report.json" + reportFile, err := os.Create(fileName) + + r.log.Debug().Str("fileName", fileName).Msg("Making a copy of the raw vulncheck json report which can be exposed for debugging") + + if err != nil { + r.log.Debug().Err(err).Msg("Failed to create copy will proceed with normal flow") + return &result, nil + } + + defer reportFile.Close() + + _, err = reportFile.Write(out) + if err != nil { + r.log.Debug().Err(err).Msg("Failed to write copy to disk will proceed with normal flow") + } + } + return &result, nil } diff --git a/pkg/vulncheck/static_runner.go b/pkg/vulncheck/static_runner.go index e9d2070..c2241e9 100644 --- a/pkg/vulncheck/static_runner.go +++ b/pkg/vulncheck/static_runner.go @@ -5,8 +5,8 @@ import ( "errors" "os" + "github.com/Templum/govulncheck-action/pkg/types" "github.com/rs/zerolog" - "golang.org/x/vuln/vulncheck" ) type StaticScanner struct { @@ -18,10 +18,10 @@ func NewLocalScanner(logger zerolog.Logger, pathToFile string) Scanner { return &StaticScanner{log: logger, path: pathToFile} } -func (r *StaticScanner) Scan() (*vulncheck.Result, error) { +func (r *StaticScanner) Scan() (*types.Result, error) { out, _ := os.ReadFile(r.path) - var result vulncheck.Result + var result types.Result err := json.Unmarshal(out, &result) if err != nil { return nil, errors.New("scan failed to produce proper report")