mirror of
https://github.com/aquasecurity/trivy.git
synced 2025-12-06 04:41:18 -08:00
Compare commits
1063 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b515bc736 | ||
|
|
25416ae6d8 | ||
|
|
85cca55930 | ||
|
|
b944ac6286 | ||
|
|
9809a07bf1 | ||
|
|
e9831cec2f | ||
|
|
04c01f6297 | ||
|
|
86e19bb677 | ||
|
|
484ddd897d | ||
|
|
9e7404e76d | ||
|
|
6ce9404c16 | ||
|
|
85c6529cb5 | ||
|
|
6c983cbf45 | ||
|
|
1ac4fd8a61 | ||
|
|
094db23a03 | ||
|
|
b6f615b535 | ||
|
|
d6d0a60d16 | ||
|
|
6f1035269d | ||
|
|
396e404eeb | ||
|
|
79e941df0d | ||
|
|
cb76acbd9f | ||
|
|
3d2fc78852 | ||
|
|
3e3c119555 | ||
|
|
685a92e09a | ||
|
|
1e0b03d47f | ||
|
|
6765c77c38 | ||
|
|
644ada1279 | ||
|
|
c9f9a9c917 | ||
|
|
bcc231d3ba | ||
|
|
7cecade3a1 | ||
|
|
a9ddb39d5f | ||
|
|
a02c06bafd | ||
|
|
e85881231f | ||
|
|
8d13f3da95 | ||
|
|
276daae672 | ||
|
|
546e7bd6b1 | ||
|
|
b69c4de757 | ||
|
|
33b8521aee | ||
|
|
c0ad4f705e | ||
|
|
a6f4ab3735 | ||
|
|
8ae754a7d2 | ||
|
|
313ade3386 | ||
|
|
b331e771aa | ||
|
|
bfe5c6f14f | ||
|
|
363a3e40ea | ||
|
|
b213956cea | ||
|
|
efbc968ca8 | ||
|
|
9a601d49ef | ||
|
|
a589353bb3 | ||
|
|
f38f8d66fb | ||
|
|
decad9b429 | ||
|
|
9c531904ad | ||
|
|
2b1de93249 | ||
|
|
5423196f4c | ||
|
|
6fb477097c | ||
|
|
df669592ed | ||
|
|
74fcd3f881 | ||
|
|
d523424fda | ||
|
|
42267f94c5 | ||
|
|
4d382a0302 | ||
|
|
1343996fec | ||
|
|
8a877c5b29 | ||
|
|
59f1a04ba5 | ||
|
|
d5a62c9a5c | ||
|
|
f1c6af3121 | ||
|
|
0977dfcde8 | ||
|
|
6b2cd7e8da | ||
|
|
96ce2db949 | ||
|
|
6c25b8326e | ||
|
|
3912768470 | ||
|
|
a17c3eec2a | ||
|
|
d8b59efea9 | ||
|
|
60a81fcb95 | ||
|
|
c73650d967 | ||
|
|
6cfdffda18 | ||
|
|
510ce1a782 | ||
|
|
92c0452b74 | ||
|
|
1eb73f3fea | ||
|
|
270dc7346f | ||
|
|
a6ff0d12bb | ||
|
|
43997f33c8 | ||
|
|
64c91249ef | ||
|
|
7baccf2088 | ||
|
|
7dd7e2ba00 | ||
|
|
67d94774ba | ||
|
|
3e6dc37728 | ||
|
|
2dc5c9152e | ||
|
|
6daf62ebeb | ||
|
|
f9ee4943b1 | ||
|
|
c3e227b625 | ||
|
|
ca390411f3 | ||
|
|
c676361681 | ||
|
|
126fe0abba | ||
|
|
f7d02538f6 | ||
|
|
f982167c0a | ||
|
|
d3a73e4db7 | ||
|
|
5d5b93ed69 | ||
|
|
36498501bf | ||
|
|
3c0e354743 | ||
|
|
f5e655e22a | ||
|
|
af5882bc3e | ||
|
|
3d2921343b | ||
|
|
df47d1be15 | ||
|
|
ef8d77351f | ||
|
|
e18f38af3c | ||
|
|
0e937b5367 | ||
|
|
911c5e971a | ||
|
|
6fd1887e64 | ||
|
|
4059e94aba | ||
|
|
24005c3ed0 | ||
|
|
84af32a7fe | ||
|
|
193680b1ed | ||
|
|
22db37e9da | ||
|
|
4ab696eaa2 | ||
|
|
b7ec642572 | ||
|
|
1e1ccbec52 | ||
|
|
4ceae2a052 | ||
|
|
4e7e842682 | ||
|
|
089d34e866 | ||
|
|
bfb0f2a193 | ||
|
|
f19243127a | ||
|
|
4c6a866cce | ||
|
|
3ecc65d626 | ||
|
|
6b95d3857f | ||
|
|
894fa25106 | ||
|
|
f6cfcaf193 | ||
|
|
94f999ec07 | ||
|
|
4b4a0c95ba | ||
|
|
6d79fcacfc | ||
|
|
7a84438925 | ||
|
|
f8951f3847 | ||
|
|
afe3292843 | ||
|
|
3d23ad846c | ||
|
|
9822b40862 | ||
|
|
898aaaa11c | ||
|
|
c8682b55e2 | ||
|
|
bb6ff8511b | ||
|
|
f776a91d18 | ||
|
|
3bed96f0cf | ||
|
|
4a7544caea | ||
|
|
267adde71b | ||
|
|
b7fc3dfc98 | ||
|
|
95285015df | ||
|
|
89893a7303 | ||
|
|
dbba0bf152 | ||
|
|
3ef450d9a4 | ||
|
|
f4ec4e7483 | ||
|
|
96a5cb106a | ||
|
|
023e09e3f3 | ||
|
|
b3759f54fa | ||
|
|
dbf4b2dec5 | ||
|
|
2ae8faa7a8 | ||
|
|
5f004f03d9 | ||
|
|
3679bc358c | ||
|
|
0911eea9c0 | ||
|
|
029dd76c30 | ||
|
|
cc5d76b4ee | ||
|
|
be3993b60a | ||
|
|
a39133a13c | ||
|
|
995024f148 | ||
|
|
3487accd99 | ||
|
|
c8e07a4bf8 | ||
|
|
4249a1cadb | ||
|
|
c9f9a346cc | ||
|
|
52934d2340 | ||
|
|
5a58e41476 | ||
|
|
329f071b30 | ||
|
|
154ccc6e35 | ||
|
|
49cfa08d25 | ||
|
|
bcc0218200 | ||
|
|
fbb83c42d9 | ||
|
|
8a4b49ca70 | ||
|
|
7ba773f2bb | ||
|
|
bd94618b34 | ||
|
|
5feabc10ee | ||
|
|
fa03e9e983 | ||
|
|
fa5dcaf8f2 | ||
|
|
6d8ae1959c | ||
|
|
d137df24f7 | ||
|
|
2c57716359 | ||
|
|
d08f3dfd6d | ||
|
|
346496f943 | ||
|
|
6601d2957a | ||
|
|
2e870836dd | ||
|
|
4066b57a84 | ||
|
|
6e2453c2d6 | ||
|
|
7c94df539c | ||
|
|
8c33bae5a8 | ||
|
|
2cdacc1517 | ||
|
|
9acb240fdc | ||
|
|
4b193b4712 | ||
|
|
1f5b26254b | ||
|
|
79d1a0163f | ||
|
|
c1b4b5be16 | ||
|
|
bbe490b162 | ||
|
|
eb0da23d53 | ||
|
|
78286aaff1 | ||
|
|
4f9e46c8d3 | ||
|
|
55f29b8fb2 | ||
|
|
b6baa65ff2 | ||
|
|
4b8e0ec2ea | ||
|
|
1a6d9cb1b0 | ||
|
|
cf78a436d2 | ||
|
|
f8c2ced302 | ||
|
|
84c199428f | ||
|
|
bdf55e16db | ||
|
|
9fd86da367 | ||
|
|
acaa8dd0be | ||
|
|
fbc9030db6 | ||
|
|
db6eb9a15b | ||
|
|
e2a31abd19 | ||
|
|
1d1f8f91c0 | ||
|
|
708a7a7175 | ||
|
|
04040b95f8 | ||
|
|
e000329ec4 | ||
|
|
142d67f296 | ||
|
|
e127334664 | ||
|
|
3870515a81 | ||
|
|
4e6389af27 | ||
|
|
5f047f97db | ||
|
|
0700586483 | ||
|
|
34de675d87 | ||
|
|
1f393c12d5 | ||
|
|
4dd5732125 | ||
|
|
1e788040c5 | ||
|
|
ca57d318da | ||
|
|
03b16ea0ba | ||
|
|
bec2e29c59 | ||
|
|
b4ddc80c99 | ||
|
|
2061873f22 | ||
|
|
254a96e1d3 | ||
|
|
110c534015 | ||
|
|
dff5dcea70 | ||
|
|
c7e8d201dc | ||
|
|
525e2685ce | ||
|
|
471e7cd5a4 | ||
|
|
9898ac9251 | ||
|
|
453a1edfd2 | ||
|
|
8cd973739a | ||
|
|
407f3b668b | ||
|
|
a0047a7983 | ||
|
|
d786655a18 | ||
|
|
a02cf65196 | ||
|
|
613e38ccf6 | ||
|
|
3b6d65beb8 | ||
|
|
22f5b938f9 | ||
|
|
67004a2b12 | ||
|
|
485637c28a | ||
|
|
6fdb554a0d | ||
|
|
d9bddb90fe | ||
|
|
528d07ef37 | ||
|
|
1cf1873f21 | ||
|
|
d77dbe8a55 | ||
|
|
065b301414 | ||
|
|
32bd1e484a | ||
|
|
0e28f7ccb6 | ||
|
|
910b8e6017 | ||
|
|
94a5a1808f | ||
|
|
72d94b21cf | ||
|
|
b4a7d6a861 | ||
|
|
0127c1d39e | ||
|
|
a92da72263 | ||
|
|
b0f3864e46 | ||
|
|
0b1d32c182 | ||
|
|
5f69847698 | ||
|
|
3637c00b51 | ||
|
|
d4e3df81e8 | ||
|
|
7e48cc1f4d | ||
|
|
8bdd3feb3f | ||
|
|
c9efa8c479 | ||
|
|
52b715421e | ||
|
|
21f7a41b27 | ||
|
|
ff2b3d176d | ||
|
|
85351adfa8 | ||
|
|
fbf50203cc | ||
|
|
9c19298f5f | ||
|
|
18fde60392 | ||
|
|
c2f38ee378 | ||
|
|
a545e3af04 | ||
|
|
c039177958 | ||
|
|
86e72c0a43 | ||
|
|
aa3d696625 | ||
|
|
177826a458 | ||
|
|
133c838902 | ||
|
|
da3d588276 | ||
|
|
31e76699da | ||
|
|
4ca35b26a7 | ||
|
|
9766c47042 | ||
|
|
db66572127 | ||
|
|
8da4548073 | ||
|
|
c3e132ade5 | ||
|
|
76e9d7eb27 | ||
|
|
2b217a3b2a | ||
|
|
902aa8ceb9 | ||
|
|
60b19e5e60 | ||
|
|
58aab67928 | ||
|
|
209b9cc25a | ||
|
|
bfb931d454 | ||
|
|
b194140c52 | ||
|
|
ae86a5b171 | ||
|
|
1a23039e31 | ||
|
|
56498ca1df | ||
|
|
02105678ed | ||
|
|
d048791355 | ||
|
|
4470a181e2 | ||
|
|
cb171ead72 | ||
|
|
36e24b1858 | ||
|
|
005fe25c75 | ||
|
|
aac7cf576e | ||
|
|
88311745ba | ||
|
|
9154b819ac | ||
|
|
fe1f9c916f | ||
|
|
9e3709fb09 | ||
|
|
f36d9b6f90 | ||
|
|
ee54733e7b | ||
|
|
7a148089ec | ||
|
|
df80fd31a0 | ||
|
|
88ebc07504 | ||
|
|
d6418cf0de | ||
|
|
12d0317a67 | ||
|
|
c3aca1524c | ||
|
|
b2b68951f2 | ||
|
|
06659f1509 | ||
|
|
e913433934 | ||
|
|
a91cc50df7 | ||
|
|
4b8bf874d8 | ||
|
|
5040caefc8 | ||
|
|
28cd5a5537 | ||
|
|
b2f554eb2a | ||
|
|
483697b416 | ||
|
|
7a44a7a344 | ||
|
|
18842fbe04 | ||
|
|
12ca3ca6da | ||
|
|
dcadfa883d | ||
|
|
728a3db6c6 | ||
|
|
4e7b5ca365 | ||
|
|
0fca2cda91 | ||
|
|
e50839bb40 | ||
|
|
f95a0f0d52 | ||
|
|
bfd6eef94c | ||
|
|
69be985153 | ||
|
|
e5bf3d1e30 | ||
|
|
2193fb3c44 | ||
|
|
4d625c21e6 | ||
|
|
bbccb5a69d | ||
|
|
a625455f1c | ||
|
|
7e69f4820e | ||
|
|
f6c986b6c0 | ||
|
|
7663c9f902 | ||
|
|
aab6f0bf20 | ||
|
|
eebf9c8f58 | ||
|
|
c3279fd9b2 | ||
|
|
971092b847 | ||
|
|
7443cba9b5 | ||
|
|
49301ccf6d | ||
|
|
6e222bd809 | ||
|
|
8c522a76af | ||
|
|
7fe75d50a0 | ||
|
|
0e84c4dcbf | ||
|
|
2f2d8222e4 | ||
|
|
a2afd6e683 | ||
|
|
82d9d4b77f | ||
|
|
a423b99312 | ||
|
|
525aadf14c | ||
|
|
a069ad7818 | ||
|
|
015055e1f5 | ||
|
|
cbaa363990 | ||
|
|
bec02f098d | ||
|
|
d7f8b92a27 | ||
|
|
59ea0d5781 | ||
|
|
c788676f87 | ||
|
|
58ade462b4 | ||
|
|
77cab6e0b9 | ||
|
|
2ede15d358 | ||
|
|
d266c74941 | ||
|
|
4423396bcc | ||
|
|
b72fa66c77 | ||
|
|
356ae30c7e | ||
|
|
f2e05d55d0 | ||
|
|
1e9376bea4 | ||
|
|
477dc7d5f9 | ||
|
|
89b8d7ff30 | ||
|
|
219b71b4fd | ||
|
|
aa6e1eb6f9 | ||
|
|
de6c3cbb6c | ||
|
|
b7d4d1ead4 | ||
|
|
e6c029d08a | ||
|
|
ec6cb1a642 | ||
|
|
7dfc16cf21 | ||
|
|
42d8fd6638 | ||
|
|
0805e8667e | ||
|
|
c3ef2035b5 | ||
|
|
f8eb21d63a | ||
|
|
ed00632796 | ||
|
|
1277e211ca | ||
|
|
5c663d389d | ||
|
|
411e5b8c97 | ||
|
|
327688504c | ||
|
|
274103e883 | ||
|
|
e618d83dae | ||
|
|
3b0b2ed4ce | ||
|
|
5c8d098324 | ||
|
|
11f4f81123 | ||
|
|
6db2092c72 | ||
|
|
b9a7fd1547 | ||
|
|
8898bb0937 | ||
|
|
9825529600 | ||
|
|
33d0833717 | ||
|
|
13874d866c | ||
|
|
f26a06b980 | ||
|
|
e2821a4fba | ||
|
|
ef8a1afcdb | ||
|
|
4310d51b7e | ||
|
|
449add24af | ||
|
|
cb9afc8441 | ||
|
|
78b2b899a0 | ||
|
|
52fd3c2e0a | ||
|
|
8d5882be03 | ||
|
|
84dd33f7e9 | ||
|
|
9e903a1d88 | ||
|
|
c04a638d1a | ||
|
|
f4c746a2d2 | ||
|
|
420f8ab13e | ||
|
|
d2827cba06 | ||
|
|
ffb5c8520f | ||
|
|
ce703ce4a5 | ||
|
|
50bb938a21 | ||
|
|
a31ddbe971 | ||
|
|
3a4e18ac82 | ||
|
|
8ba68361bd | ||
|
|
f5c5573936 | ||
|
|
eab2b425db | ||
|
|
533498f4f0 | ||
|
|
2768c280c9 | ||
|
|
4e8832de4f | ||
|
|
cabd18daae | ||
|
|
02c3c3659d | ||
|
|
4b6109746e | ||
|
|
c6daf1a896 | ||
|
|
d2a4db8887 | ||
|
|
4f7b768369 | ||
|
|
d754cb8c6f | ||
|
|
a936e675c9 | ||
|
|
abf0055634 | ||
|
|
af116d3c9e | ||
|
|
b507360075 | ||
|
|
7fcbf44bb8 | ||
|
|
478d279919 | ||
|
|
33bd41b40f | ||
|
|
39a10089fc | ||
|
|
37abd612aa | ||
|
|
78de33e8ea | ||
|
|
22054626f3 | ||
|
|
28ddcf1ae8 | ||
|
|
9806fa6f92 | ||
|
|
c4fdc40f82 | ||
|
|
df134c73f8 | ||
|
|
8da20c8c92 | ||
|
|
714b5ca246 | ||
|
|
1bb7e4894e | ||
|
|
51e152b01c | ||
|
|
d081855849 | ||
|
|
ab0cb4f73b | ||
|
|
49a72f216f | ||
|
|
0c8521a856 | ||
|
|
89fa4a27ab | ||
|
|
884daff429 | ||
|
|
2a8336b9aa | ||
|
|
1e171af165 | ||
|
|
e65274e0ef | ||
|
|
db35450bbb | ||
|
|
24254d19f6 | ||
|
|
2ee074568c | ||
|
|
0d2edbfa36 | ||
|
|
0aef82c58e | ||
|
|
8b2a799721 | ||
|
|
42f795fa34 | ||
|
|
8f737cc6eb | ||
|
|
996961a33f | ||
|
|
76249bdcf0 | ||
|
|
e9251fe0a8 | ||
|
|
59957d4c6b | ||
|
|
da8b72d2e7 | ||
|
|
965400a481 | ||
|
|
310dd3f5c0 | ||
|
|
b713ad0fd3 | ||
|
|
91d4d9e385 | ||
|
|
56115e9d4f | ||
|
|
7f859afacb | ||
|
|
88094b1142 | ||
|
|
628a7964d5 | ||
|
|
c287239236 | ||
|
|
82fba77141 | ||
|
|
d5269da5ee | ||
|
|
0a17306666 | ||
|
|
8e57dee86b | ||
|
|
c506f43613 | ||
|
|
8bfbc84a41 | ||
|
|
1e811de263 | ||
|
|
8b5796f770 | ||
|
|
a2199bb417 | ||
|
|
279e76f704 | ||
|
|
7e09a9f84a | ||
|
|
5262590831 | ||
|
|
c275a841fd | ||
|
|
7beed30170 | ||
|
|
f50e1f42a1 | ||
|
|
3ae4de5869 | ||
|
|
f733307991 | ||
|
|
6e35b8f53c | ||
|
|
beb60b05f3 | ||
|
|
582e7fd1ba | ||
|
|
11bc290111 | ||
|
|
bb5abd4cc7 | ||
|
|
18d683af15 | ||
|
|
6793d65417 | ||
|
|
776f0ec16d | ||
|
|
0523fbc6be | ||
|
|
392f68926c | ||
|
|
101d576025 | ||
|
|
bd3ba68cce | ||
|
|
3860d6e4e9 | ||
|
|
4f82673a61 | ||
|
|
95afbb1a11 | ||
|
|
7d550ea025 | ||
|
|
b9a51de862 | ||
|
|
7f248341cc | ||
|
|
af3eaefdb2 | ||
|
|
07c9200eb7 | ||
|
|
8bc8a4ad60 | ||
|
|
9076a49b0f | ||
|
|
bb316d93ca | ||
|
|
efdb29d0d4 | ||
|
|
9bcf9e72f5 | ||
|
|
3147097daf | ||
|
|
33f74b3acb | ||
|
|
5915ffb42b | ||
|
|
1ac6e8aef6 | ||
|
|
ae4c42b975 | ||
|
|
b640ef099c | ||
|
|
a688cdf7af | ||
|
|
0abfcf53e4 | ||
|
|
e0dfc37ef5 | ||
|
|
3f52e32786 | ||
|
|
19747d0535 | ||
|
|
da45061f4d | ||
|
|
cb1a4ed3a1 | ||
|
|
0dbcb834ef | ||
|
|
6ad9b2558a | ||
|
|
6726d12587 | ||
|
|
41c0dbb767 | ||
|
|
0d03242cfc | ||
|
|
8a6775ad14 | ||
|
|
69dae54aa1 | ||
|
|
2674ce89ea | ||
|
|
802cc6fb26 | ||
|
|
b0de7fc645 | ||
|
|
5dc8cfe55d | ||
|
|
798b564ee3 | ||
|
|
21bf5e58f7 | ||
|
|
e0f4ebd7cb | ||
|
|
23a9a5e319 | ||
|
|
1f5d17fe13 | ||
|
|
bcfa0287b9 | ||
|
|
681ab1b889 | ||
|
|
46051d5ec8 | ||
|
|
223b1fd118 | ||
|
|
0ad38f33bc | ||
|
|
894d65898d | ||
|
|
d8d692b8ba | ||
|
|
cc344dfbe3 | ||
|
|
0dec17fc3f | ||
|
|
7c72035b87 | ||
|
|
1829e36541 | ||
|
|
f12446d3ba | ||
|
|
d974076fe1 | ||
|
|
1c9ccb5e03 | ||
|
|
5eb94f785b | ||
|
|
a463e794ce | ||
|
|
e0ca5eff38 | ||
|
|
173b3eb654 | ||
|
|
1ebb3296ee | ||
|
|
b37f682ee2 | ||
|
|
c80126ab41 | ||
|
|
7e9fd6719c | ||
|
|
b76899c318 | ||
|
|
da905108b4 | ||
|
|
a2b995a671 | ||
|
|
bd57b4f9b5 | ||
|
|
12463ce1b0 | ||
|
|
9b78112814 | ||
|
|
ad721cf154 | ||
|
|
96f7cc774a | ||
|
|
9027dc3252 | ||
|
|
843813c0f3 | ||
|
|
5750cc2e1a | ||
|
|
94460305f3 | ||
|
|
bbcce9f7b7 | ||
|
|
f7329d0d9f | ||
|
|
b04be6834a | ||
|
|
6bcb4af10f | ||
|
|
8d13234554 | ||
|
|
982f35b424 | ||
|
|
791cf73bcb | ||
|
|
2e170cd15a | ||
|
|
92d1b61b5d | ||
|
|
7f5b5a6aa8 | ||
|
|
dd49885a45 | ||
|
|
eec42da179 | ||
|
|
cc6c67d81c | ||
|
|
669fd1fd1d | ||
|
|
8cd7de276e | ||
|
|
3bf3a46cd4 | ||
|
|
8edcc62a8d | ||
|
|
074587e22a | ||
|
|
31c45ffc52 | ||
|
|
d8cc8b550b | ||
|
|
9a4e3b1ffa | ||
|
|
f76c806687 | ||
|
|
f21e5919a1 | ||
|
|
1dce67f41b | ||
|
|
dbc7a83e8c | ||
|
|
8020b0fcfb | ||
|
|
fa57fce6c9 | ||
|
|
08e9240efd | ||
|
|
41c38375b5 | ||
|
|
34c3c46056 | ||
|
|
bb20d89469 | ||
|
|
62ccd79436 | ||
|
|
19c0b70d26 | ||
|
|
1c877da6fd | ||
|
|
ff9631b94f | ||
|
|
255bbe1477 | ||
|
|
6c11c0c5a6 | ||
|
|
9d617777d5 | ||
|
|
1ac15af66b | ||
|
|
5d57deaa4f | ||
|
|
b5955597a4 | ||
|
|
b1410b27b8 | ||
|
|
0e777d386e | ||
|
|
b6d9c30eea | ||
|
|
5160a2eb53 | ||
|
|
473fe3a487 | ||
|
|
b01a7b7207 | ||
|
|
beaf89351c | ||
|
|
40ed227c23 | ||
|
|
57eafb5545 | ||
|
|
6434945ee2 | ||
|
|
fd1fbf9c54 | ||
|
|
1352f0e964 | ||
|
|
9a5940cede | ||
|
|
2a4400c147 | ||
|
|
493a383497 | ||
|
|
9763688eca | ||
|
|
d4855d203c | ||
|
|
620831145c | ||
|
|
02c4a51493 | ||
|
|
fbce2901f9 | ||
|
|
ba0aeedfe8 | ||
|
|
3ec380e500 | ||
|
|
82eb630be7 | ||
|
|
0058bafdee | ||
|
|
940367cf2c | ||
|
|
78845b4767 | ||
|
|
d55c687c2e | ||
|
|
e749817ebb | ||
|
|
4a8db20a9a | ||
|
|
8eb30c2f02 | ||
|
|
8db9b6a2a6 | ||
|
|
0f8ac99dfc | ||
|
|
380c05baee | ||
|
|
4ca24d9a6f | ||
|
|
c159501d0d | ||
|
|
76e63d1124 | ||
|
|
79b6684840 | ||
|
|
214fe82c7e | ||
|
|
c489e31f5d | ||
|
|
efd812cb1a | ||
|
|
3a920dc401 | ||
|
|
7cb1598991 | ||
|
|
e73d250a1d | ||
|
|
adc7ecc159 | ||
|
|
6a8800286e | ||
|
|
f3f3029014 | ||
|
|
0e52fde047 | ||
|
|
9b3fba04f9 | ||
|
|
81e4ab54dd | ||
|
|
13823326ed | ||
|
|
1101634f6a | ||
|
|
499b7a6ecf | ||
|
|
cea9b0bc78 | ||
|
|
dea3428804 | ||
|
|
47d600a9b4 | ||
|
|
eae4bafff3 | ||
|
|
9e08bd44fb | ||
|
|
d9883e4442 | ||
|
|
e6f7e556e8 | ||
|
|
c8cfd72cd5 | ||
|
|
4b84e79cc3 | ||
|
|
05ae22a85c | ||
|
|
0e8ab4f811 | ||
|
|
a0e5c3a2e2 | ||
|
|
c0e4e47aba | ||
|
|
9bad4c6cc8 | ||
|
|
8e8274eca7 | ||
|
|
797fd0884f | ||
|
|
5d54332bb0 | ||
|
|
a922042d2a | ||
|
|
c3d5832300 | ||
|
|
959c07688e | ||
|
|
8172518a05 | ||
|
|
07a11744d5 | ||
|
|
712f9eba35 | ||
|
|
3120d6c3e1 | ||
|
|
67b7257660 | ||
|
|
cb66108f4d | ||
|
|
ac56d1c24d | ||
|
|
867eee8499 | ||
|
|
1ab6552f73 | ||
|
|
803b2f9a93 | ||
|
|
92f980f4b7 | ||
|
|
52e98f1bd9 | ||
|
|
6cd9a328a4 | ||
|
|
03a73667db | ||
|
|
a29d6d8c5b | ||
|
|
2a08969ddc | ||
|
|
3a94b7399b | ||
|
|
41d000c97e | ||
|
|
78da283c1b | ||
|
|
e362843705 | ||
|
|
097b8d4881 | ||
|
|
3b6122f86d | ||
|
|
f75a36945c | ||
|
|
e4c32cdb77 | ||
|
|
60c5a04ad1 | ||
|
|
2bb882fdec | ||
|
|
fb19abd09a | ||
|
|
d2afc206b2 | ||
|
|
43ff5f93e8 | ||
|
|
5e6a50b2f9 | ||
|
|
23b9533791 | ||
|
|
d1f8cfcfdc | ||
|
|
aa2336be92 | ||
|
|
e64617212e | ||
|
|
85e45cad95 | ||
|
|
9fa512a652 | ||
|
|
349371bbc9 | ||
|
|
4446961167 | ||
|
|
04473ada48 | ||
|
|
1b66b77f69 | ||
|
|
a0f5bdc861 | ||
|
|
4a2b1c09d1 | ||
|
|
6fd4c8951f | ||
|
|
8fc6ea6489 | ||
|
|
eaf2da20a6 | ||
|
|
083c157b05 | ||
|
|
e26e39a7f8 | ||
|
|
04e7ccabea | ||
|
|
b2dd367f8e | ||
|
|
415e1d8ea3 | ||
|
|
7141f20e88 | ||
|
|
3bb8852ef7 | ||
|
|
c0fddd9467 | ||
|
|
41c066d4c8 | ||
|
|
f6a678c60a | ||
|
|
2316931e3b | ||
|
|
77f3d55149 | ||
|
|
b319579b78 | ||
|
|
0c0febe28a | ||
|
|
d41736b828 | ||
|
|
c88bbbd6cc | ||
|
|
d88b7cfb08 | ||
|
|
3cf1f4c972 | ||
|
|
271879331e | ||
|
|
1385fa4190 | ||
|
|
0346a106f8 | ||
|
|
60a4e7e5d4 | ||
|
|
39ab6bd630 | ||
|
|
0518d2785f | ||
|
|
a6b8ec3134 | ||
|
|
6d22387727 | ||
|
|
7221579340 | ||
|
|
ee29ffaf4f | ||
|
|
8935aa6523 | ||
|
|
288481ffe1 | ||
|
|
f961e9912e | ||
|
|
0edf73bf3d | ||
|
|
f5b060a9f1 | ||
|
|
c26a3e481f | ||
|
|
493a70b45c | ||
|
|
8b3b5d0290 | ||
|
|
37edc66418 | ||
|
|
becd5088df | ||
|
|
e517bef17f | ||
|
|
da2b28a3bb | ||
|
|
965bb6d08a | ||
|
|
b64a526223 | ||
|
|
1a53cbe31a | ||
|
|
34f865d6e5 | ||
|
|
049728665f | ||
|
|
30fc5b97da | ||
|
|
fcb9a93d05 | ||
|
|
425eaf8a2a | ||
|
|
059deda653 | ||
|
|
47ce996d36 | ||
|
|
c813a60b6f | ||
|
|
907e6be7fd | ||
|
|
e890ae02c2 | ||
|
|
9bc3565af1 | ||
|
|
a0cd5d70ae | ||
|
|
3170dc3e63 | ||
|
|
10ad2edd3c | ||
|
|
c9f22f4e55 | ||
|
|
4f9e51897e | ||
|
|
3047c524d9 | ||
|
|
89e5295421 | ||
|
|
cdabe7fc9e | ||
|
|
b0fe439309 | ||
|
|
6685cd4e21 | ||
|
|
7a683bd02e | ||
|
|
6ed03a83a5 | ||
|
|
182cb800a8 | ||
|
|
2acd1cafd0 | ||
|
|
dd35bfd1a1 | ||
|
|
1f17e71dce | ||
|
|
4a10108d11 | ||
|
|
0954f6b1bb | ||
|
|
6b29bf1c71 | ||
|
|
f6afdf0145 | ||
|
|
3f358815c9 | ||
|
|
412847d6a2 | ||
|
|
5b2786213a | ||
|
|
6ed25c19e6 | ||
|
|
bac65cb793 | ||
|
|
e2c483f856 | ||
|
|
5c5e0cb86d | ||
|
|
b9b84cd963 | ||
|
|
e517bcc2b2 | ||
|
|
7f5a6d479e | ||
|
|
8de09ddf37 | ||
|
|
e08ae8d01d | ||
|
|
a00d719ed2 | ||
|
|
08ca1b00b7 | ||
|
|
7b86f81e29 | ||
|
|
8cd4afeaf1 | ||
|
|
a20d4811d2 | ||
|
|
b606b621e5 | ||
|
|
7da3f7e57d | ||
|
|
42520f3edf | ||
|
|
5c2b14b910 | ||
|
|
a19a023f1f | ||
|
|
e6cef75162 | ||
|
|
b75c6c4158 | ||
|
|
1371f72cfb | ||
|
|
8ecaa2f057 | ||
|
|
8132174754 | ||
|
|
bcc285095d | ||
|
|
cb369727cd | ||
|
|
9bdbeaba66 | ||
|
|
d85cb77123 | ||
|
|
1bee83ccc4 | ||
|
|
da40228e28 | ||
|
|
4d1894327e | ||
|
|
91dc954116 | ||
|
|
e17931c273 | ||
|
|
1391b3bf47 | ||
|
|
b6d5b82c48 | ||
|
|
9dfb0fe3a9 | ||
|
|
455546975c | ||
|
|
c189aa6a0a | ||
|
|
8442528fa7 | ||
|
|
d09787e150 | ||
|
|
8006d76f5d | ||
|
|
0285a89c7c | ||
|
|
7d7784fecb | ||
|
|
ca6f196001 | ||
|
|
e621cf2bc1 | ||
|
|
906ab5483e | ||
|
|
1549c25709 | ||
|
|
fe1d07e58c | ||
|
|
793a1aa3c8 | ||
|
|
4a94477532 | ||
|
|
9bc2b1949c | ||
|
|
49691ba85e | ||
|
|
87ff0c1bbc | ||
|
|
de30c3f8d6 | ||
|
|
4c3bfb89a4 | ||
|
|
8b21cfe7eb | ||
|
|
46700f7b74 | ||
|
|
fde2487249 | ||
|
|
014be7e143 | ||
|
|
b3ff2c35ea | ||
|
|
9c786de8f9 | ||
|
|
188e108d7c | ||
|
|
7d7842f2f3 | ||
|
|
901a3715cb | ||
|
|
095b5ce97c | ||
|
|
1d3f70e07f | ||
|
|
5e308da81a | ||
|
|
2231e4068d | ||
|
|
b3680f0016 | ||
|
|
89527796f6 | ||
|
|
165d593fdb | ||
|
|
d8b09628f0 | ||
|
|
b62ebec01e | ||
|
|
66b9842ac9 | ||
|
|
d35e8ec351 | ||
|
|
fa1f12776b | ||
|
|
3f64bd6b32 | ||
|
|
c875ba5942 | ||
|
|
0bd417531d | ||
|
|
80595dc426 | ||
|
|
ceb4e47ef1 | ||
|
|
4025117c23 | ||
|
|
d56c477e5f | ||
|
|
717f36c819 | ||
|
|
e8d06ba336 | ||
|
|
81390970cd | ||
|
|
4c77b76406 | ||
|
|
a1e818ac5e | ||
|
|
81526ed0d9 | ||
|
|
83ff3fda25 | ||
|
|
aa4339ca41 | ||
|
|
b22aebf826 | ||
|
|
364cc862f7 | ||
|
|
05ea7f4201 | ||
|
|
8b3289c880 | ||
|
|
fc2f5ddbb2 | ||
|
|
21e1ebf92c | ||
|
|
bf63cc7f34 | ||
|
|
5d7149d6cf | ||
|
|
c63e3aa5d5 | ||
|
|
3ac504288d | ||
|
|
016f45e8d3 | ||
|
|
45ada28e38 | ||
|
|
b0937b624b | ||
|
|
bfa6e76141 | ||
|
|
f0dc9fa748 | ||
|
|
412209b0d1 | ||
|
|
3d55fc5ea6 | ||
|
|
495332ccd1 | ||
|
|
285e1f1bbf | ||
|
|
d3979a0d1f | ||
|
|
c87f30c25e | ||
|
|
d328815939 | ||
|
|
ca5843cec2 | ||
|
|
1d57f7be5c | ||
|
|
68eb4c6c8d | ||
|
|
eaf9fa5e3f | ||
|
|
60a7565870 | ||
|
|
78df35b570 | ||
|
|
162fb42d62 | ||
|
|
7d0165c767 | ||
|
|
7ef1e5f970 | ||
|
|
94f9cf49fb | ||
|
|
bed0a0ebd1 | ||
|
|
0c254184d6 | ||
|
|
306c551fdf | ||
|
|
9c6b9a69c3 | ||
|
|
2cb920d5d9 | ||
|
|
9bf16ae1ba | ||
|
|
3867fc71ee | ||
|
|
3348a0669e | ||
|
|
030687c989 | ||
|
|
a273649227 | ||
|
|
e6a79f7bc7 | ||
|
|
2c08d9d3dc | ||
|
|
673fc374ed | ||
|
|
511e061c0c | ||
|
|
55e97e97ce | ||
|
|
aac55275bb | ||
|
|
9aea551d86 | ||
|
|
72334df0c5 | ||
|
|
72e5ec702d | ||
|
|
971269bac8 | ||
|
|
98341f1e9e | ||
|
|
1e66346f29 | ||
|
|
e41cf57454 | ||
|
|
3813f90496 | ||
|
|
24c612e166 | ||
|
|
d993110d96 | ||
|
|
e4b1b64788 | ||
|
|
a1ea9aeeeb | ||
|
|
3aca6b2d6a | ||
|
|
a183360e76 | ||
|
|
7eb94404a3 | ||
|
|
985442dc1c | ||
|
|
95e89a424e | ||
|
|
728ba00be5 | ||
|
|
177a2b0ad9 | ||
|
|
f9907823b8 | ||
|
|
cf9d00dfc2 | ||
|
|
9e8f0bb4f0 | ||
|
|
83f0e2b08b | ||
|
|
b318dec1e0 | ||
|
|
3841cf6d94 | ||
|
|
cdeb41a58c | ||
|
|
4a9f3d9aa9 | ||
|
|
d5d2729237 | ||
|
|
a5ed21ec13 | ||
|
|
afcb70977c | ||
|
|
c9f8a8546e | ||
|
|
f9a8f80485 | ||
|
|
a8380ab5e5 | ||
|
|
430740f537 | ||
|
|
cef12efc04 | ||
|
|
3a38594cd1 | ||
|
|
6c02a38295 | ||
|
|
4e0c7fc226 | ||
|
|
dd938fd693 | ||
|
|
e41f180236 | ||
|
|
b7debf7f0a | ||
|
|
ce1f557cf7 | ||
|
|
9fa86c550a | ||
|
|
89f6348b9c | ||
|
|
faed25bfec | ||
|
|
856dd3a464 | ||
|
|
cb5b791d13 | ||
|
|
1211b105dc | ||
|
|
e9e2777c32 | ||
|
|
123ee18257 | ||
|
|
224069af28 | ||
|
|
5e96fa6a55 | ||
|
|
d773f56aae | ||
|
|
48a3ac53fb | ||
|
|
1d2fe13f28 | ||
|
|
c8127c458f | ||
|
|
2c3bf38c73 | ||
|
|
1778abe4e3 | ||
|
|
c0563f81bc | ||
|
|
028073bd02 | ||
|
|
8394568aa0 | ||
|
|
1b5c33658f | ||
|
|
808a6459b4 | ||
|
|
05821edb41 | ||
|
|
e55ec73aba | ||
|
|
fefe879691 | ||
|
|
bd57e64268 | ||
|
|
66aac5d640 | ||
|
|
f071cecd5c | ||
|
|
6a2ca8f74f | ||
|
|
5529c83920 | ||
|
|
022b948545 | ||
|
|
f99701585f | ||
|
|
76333a382c | ||
|
|
ed8de8b1aa | ||
|
|
e72e8693ef | ||
|
|
f06501ea2b | ||
|
|
e996e0112a | ||
|
|
f6fe06fd12 | ||
|
|
984ce9bd38 | ||
|
|
c7cf493ebd | ||
|
|
9916efbf5e | ||
|
|
0954e0f44b | ||
|
|
c7208b3efa | ||
|
|
262fee4195 | ||
|
|
9f32fd0525 | ||
|
|
8065c4bf53 | ||
|
|
64d449ee57 | ||
|
|
68cb8ceba4 | ||
|
|
ec2b20dcd8 | ||
|
|
552c4de1a0 | ||
|
|
7b3bf986e8 |
@@ -1,72 +0,0 @@
|
|||||||
version: 2.1
|
|
||||||
orbs:
|
|
||||||
codecov: codecov/codecov@1.1.0
|
|
||||||
|
|
||||||
defaults: &defaults
|
|
||||||
docker :
|
|
||||||
- image: aquasec/trivy-ci:latest
|
|
||||||
environment:
|
|
||||||
CGO_ENABLED: "0"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
unit-test:
|
|
||||||
<<: *defaults
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- run:
|
|
||||||
name: Check if there's anything to fix with gofmt
|
|
||||||
command: |
|
|
||||||
if test -z "$(gofmt -l .)"; then
|
|
||||||
echo "Congrats! There is nothing to fix."
|
|
||||||
else
|
|
||||||
echo "The following lines should be fixed."
|
|
||||||
gofmt -s -d .
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
- run:
|
|
||||||
name: Test
|
|
||||||
command: make test
|
|
||||||
- codecov/upload:
|
|
||||||
file: ./coverage.txt
|
|
||||||
|
|
||||||
release:
|
|
||||||
<<: *defaults
|
|
||||||
steps:
|
|
||||||
- checkout
|
|
||||||
- setup_remote_docker:
|
|
||||||
version: 18.06.0-ce
|
|
||||||
- run:
|
|
||||||
name: setup docker
|
|
||||||
command: echo $DOCKER_PASS | docker login --username $DOCKER_USER --password-stdin
|
|
||||||
- run:
|
|
||||||
name: Release
|
|
||||||
command: goreleaser --rm-dist
|
|
||||||
- run:
|
|
||||||
name: Clone trivy repository
|
|
||||||
command: git clone git@github.com:aquasecurity/trivy-repo.git
|
|
||||||
- run:
|
|
||||||
name: Setup git settings
|
|
||||||
command: |
|
|
||||||
git config --global user.email "knqyf263@gmail.com"
|
|
||||||
git config --global user.name "Teppei Fukuda"
|
|
||||||
- run:
|
|
||||||
name: Create rpm repository
|
|
||||||
command: ci/deploy-rpm.sh
|
|
||||||
- run:
|
|
||||||
name: Import GPG key
|
|
||||||
command: echo -e "$GPG_KEY" | gpg --import
|
|
||||||
- run:
|
|
||||||
name: Create deb repository
|
|
||||||
command: ci/deploy-deb.sh
|
|
||||||
|
|
||||||
workflows:
|
|
||||||
version: 2
|
|
||||||
release:
|
|
||||||
jobs:
|
|
||||||
- unit-test
|
|
||||||
- release:
|
|
||||||
filters:
|
|
||||||
branches:
|
|
||||||
ignore: /.*/
|
|
||||||
tags:
|
|
||||||
only: /.*/
|
|
||||||
9
.github/CODEOWNERS
vendored
Normal file
9
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Global
|
||||||
|
* @knqyf263
|
||||||
|
|
||||||
|
# Helm chart
|
||||||
|
helm/trivy/ @krol3
|
||||||
|
|
||||||
|
# Kubernetes scanning
|
||||||
|
pkg/k8s/ @josedonizetti @chen-keinan
|
||||||
|
docs/docs/kubernetes/ @josedonizetti @chen-keinan
|
||||||
12
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
12
.github/ISSUE_TEMPLATE/BUG_REPORT.md
vendored
@@ -4,28 +4,28 @@ labels: kind/bug
|
|||||||
about: If something isn't working as expected.
|
about: If something isn't working as expected.
|
||||||
---
|
---
|
||||||
|
|
||||||
**Description**
|
## Description
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Briefly describe the problem you are having in a few paragraphs.
|
Briefly describe the problem you are having in a few paragraphs.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
**What did you expect to happen?**
|
## What did you expect to happen?
|
||||||
|
|
||||||
|
|
||||||
**What happened instead?**
|
## What happened instead?
|
||||||
|
|
||||||
|
|
||||||
**Output of run with `-debug`:**
|
## Output of run with `-debug`:
|
||||||
|
|
||||||
```
|
```
|
||||||
(paste your output here)
|
(paste your output here)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Output of `trivy -v`:**
|
## Output of `trivy -v`:
|
||||||
|
|
||||||
```
|
```
|
||||||
(paste your output here)
|
(paste your output here)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Additional details (base image name, container registry info...):**
|
## Additional details (base image name, container registry info...):
|
||||||
|
|||||||
33
.github/ISSUE_TEMPLATE/WRONG_DETECTION.md
vendored
Normal file
33
.github/ISSUE_TEMPLATE/WRONG_DETECTION.md
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
name: Wrong Detection
|
||||||
|
labels: ["kind/bug"]
|
||||||
|
about: If Trivy doesn't detect something, or shows false positive detection
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
- [ ] I've read [the documentation regarding wrong detection](https://aquasecurity.github.io/trivy/latest/community/contribute/issue/#wrong-detection).
|
||||||
|
- [ ] I've confirmed that a security advisory in data sources was correct.
|
||||||
|
- Run Trivy with `-f json` that shows data sources and make sure that the security advisory is correct.
|
||||||
|
|
||||||
|
|
||||||
|
## Description
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Briefly describe the CVE that aren't detected and information about artifacts with this CVE.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## JSON Output of run with `-debug`:
|
||||||
|
|
||||||
|
```
|
||||||
|
(paste your output here)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Output of `trivy -v`:
|
||||||
|
|
||||||
|
```
|
||||||
|
(paste your output here)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Additional details (base image name, container registry info...):
|
||||||
|
|
||||||
|
|
||||||
15
.github/dependabot.yml
vendored
Normal file
15
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
|
- package-ecosystem: docker
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
|
- package-ecosystem: gomod
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: monthly
|
||||||
18
.github/pull_request_template.md
vendored
Normal file
18
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
## Description
|
||||||
|
|
||||||
|
## Related issues
|
||||||
|
- Close #XXX
|
||||||
|
|
||||||
|
## Related PRs
|
||||||
|
- [ ] #XXX
|
||||||
|
- [ ] #YYY
|
||||||
|
|
||||||
|
Remove this section if you don't have related PRs.
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
- [ ] I've read the [guidelines for contributing](https://aquasecurity.github.io/trivy/latest/community/contribute/pr/) to this repository.
|
||||||
|
- [ ] I've followed the [conventions](https://aquasecurity.github.io/trivy/latest/community/contribute/pr/#title) in the PR title.
|
||||||
|
- [ ] I've added tests that prove my fix is effective or that my feature works.
|
||||||
|
- [ ] I've updated the [documentation](https://github.com/aquasecurity/trivy/blob/main/docs) with the relevant information (if needed).
|
||||||
|
- [ ] I've added usage information (if the PR introduces new options)
|
||||||
|
- [ ] I've included a "before" and "after" example to the description (if the PR is a user interface change).
|
||||||
33
.github/workflows/mkdocs-dev.yaml
vendored
Normal file
33
.github/workflows/mkdocs-dev.yaml
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
name: Deploy the dev documentation
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'docs/**'
|
||||||
|
- mkdocs.yml
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
name: Deploy the dev documentation
|
||||||
|
runs-on: ubuntu-18.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout main
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
persist-credentials: true
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
|
||||||
|
pip install -r docs/build/requirements.txt
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.MKDOCS_AQUA_BOT }}
|
||||||
|
- name: Configure the git user
|
||||||
|
run: |
|
||||||
|
git config user.name "knqyf263"
|
||||||
|
git config user.email "knqyf263@gmail.com"
|
||||||
|
- name: Deploy the dev documents
|
||||||
|
run: mike deploy --push dev
|
||||||
41
.github/workflows/mkdocs-latest.yaml
vendored
Normal file
41
.github/workflows/mkdocs-latest.yaml
vendored
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
name: Deploy the latest documentation
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: Version to be deployed
|
||||||
|
required: true
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
name: Deploy the latest documentation
|
||||||
|
runs-on: ubuntu-18.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout main
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
persist-credentials: true
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git
|
||||||
|
pip install -r docs/build/requirements.txt
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.MKDOCS_AQUA_BOT }}
|
||||||
|
- name: Configure the git user
|
||||||
|
run: |
|
||||||
|
git config user.name "knqyf263"
|
||||||
|
git config user.email "knqyf263@gmail.com"
|
||||||
|
- name: Deploy the latest documents from new tag push
|
||||||
|
if: ${{ github.event.inputs.version == '' }}
|
||||||
|
run: |
|
||||||
|
VERSION=$(echo ${{ github.ref }} | sed -e "s#refs/tags/##g")
|
||||||
|
mike deploy --push --update-aliases $VERSION latest
|
||||||
|
- name: Deploy the latest documents from manual trigger
|
||||||
|
if: ${{ github.event.inputs.version != '' }}
|
||||||
|
run: mike deploy --push --update-aliases ${{ github.event.inputs.version }} latest
|
||||||
87
.github/workflows/publish-chart.yaml
vendored
Normal file
87
.github/workflows/publish-chart.yaml
vendored
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
|
||||||
|
name: Publish Helm chart
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'helm/trivy/**'
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
env:
|
||||||
|
HELM_REP: helm-charts
|
||||||
|
GH_OWNER: aquasecurity
|
||||||
|
CHART_DIR: helm/trivy
|
||||||
|
KIND_VERSION: "v0.11.1"
|
||||||
|
KIND_IMAGE: "kindest/node:v1.21.1@sha256:69860bda5563ac81e3c0057d654b5253219618a22ec3a346306239bba8cfa1a6"
|
||||||
|
jobs:
|
||||||
|
test-chart:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Install Helm
|
||||||
|
uses: azure/setup-helm@18bc76811624f360dbd7f18c2d4ecb32c7b87bab
|
||||||
|
with:
|
||||||
|
version: v3.5.0
|
||||||
|
- name: Set up python
|
||||||
|
uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: 3.7
|
||||||
|
- name: Setup Chart Linting
|
||||||
|
id: lint
|
||||||
|
uses: helm/chart-testing-action@dae259e86a35ff09145c0805e2d7dd3f7207064a
|
||||||
|
- name: Setup Kubernetes cluster (KIND)
|
||||||
|
uses: helm/kind-action@94729529f85113b88f4f819c17ce61382e6d8478
|
||||||
|
with:
|
||||||
|
version: ${{ env.KIND_VERSION }}
|
||||||
|
image: ${{ env.KIND_IMAGE }}
|
||||||
|
- name: Run chart-testing
|
||||||
|
run: ct lint-and-install --validate-maintainers=false --charts helm/trivy
|
||||||
|
- name: Run chart-testing (Ingress enabled)
|
||||||
|
run: |
|
||||||
|
sed -i -e '117s,false,'true',g' ./helm/trivy/values.yaml
|
||||||
|
ct lint-and-install --validate-maintainers=false --charts helm/trivy
|
||||||
|
|
||||||
|
publish-chart:
|
||||||
|
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
|
||||||
|
needs:
|
||||||
|
- test-chart
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Install chart-releaser
|
||||||
|
run: |
|
||||||
|
wget https://github.com/helm/chart-releaser/releases/download/v1.3.0/chart-releaser_1.3.0_linux_amd64.tar.gz
|
||||||
|
echo "baed2315a9bb799efb71d512c5198a2a3b8dcd139d7f22f878777cffcd649a37 chart-releaser_1.3.0_linux_amd64.tar.gz" | sha256sum -c -
|
||||||
|
tar xzvf chart-releaser_1.3.0_linux_amd64.tar.gz cr
|
||||||
|
- name: Package helm chart
|
||||||
|
run: |
|
||||||
|
./cr package ${{ env.CHART_DIR }}
|
||||||
|
- name: Upload helm chart
|
||||||
|
# Failed with upload the same version: https://github.com/helm/chart-releaser/issues/101
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
./cr upload -o ${{ env.GH_OWNER }} -r ${{ env.HELM_REP }} --token ${{ secrets.ORG_REPO_TOKEN }} -p .cr-release-packages
|
||||||
|
- name: Index helm chart
|
||||||
|
run: |
|
||||||
|
./cr index -o ${{ env.GH_OWNER }} -r ${{ env.HELM_REP }} -c https://${{ env.GH_OWNER }}.github.io/${{ env.HELM_REP }}/ -i index.yaml
|
||||||
|
- name: Push index file
|
||||||
|
uses: dmnemec/copy_file_to_another_repo_action@c93037aa10fa8893de271f19978c980d0c1a9b37 #v1.1.1
|
||||||
|
env:
|
||||||
|
API_TOKEN_GITHUB: ${{ secrets.ORG_REPO_TOKEN }}
|
||||||
|
with:
|
||||||
|
source_file: 'index.yaml'
|
||||||
|
destination_repo: '${{ env.GH_OWNER }}/${{ env.HELM_REP }}'
|
||||||
|
destination_folder: '.'
|
||||||
|
destination_branch: 'gh-pages'
|
||||||
|
user_email: aqua-bot@users.noreply.github.com
|
||||||
|
user_name: 'aqua-bot'
|
||||||
92
.github/workflows/release.yaml
vendored
Normal file
92
.github/workflows/release.yaml
vendored
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
name: Release
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
env:
|
||||||
|
GO_VERSION: "1.18"
|
||||||
|
GH_USER: "aqua-bot"
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
name: Release
|
||||||
|
runs-on: ubuntu-18.04 # 20.04 doesn't provide createrepo for now
|
||||||
|
env:
|
||||||
|
DOCKER_CLI_EXPERIMENTAL: "enabled"
|
||||||
|
permissions:
|
||||||
|
id-token: write # For cosign
|
||||||
|
packages: write # For GHCR
|
||||||
|
contents: read # Not required for public repositories, but for clarity
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get -y update
|
||||||
|
sudo apt-get -y install rpm reprepro createrepo distro-info
|
||||||
|
- uses: sigstore/cosign-installer@536b37ec5d5b543420bdfd9b744c5965bd4d8730
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
- name: Show available Docker Buildx platforms
|
||||||
|
run: echo ${{ steps.buildx.outputs.platforms }}
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Cache Go modules
|
||||||
|
uses: actions/cache@v3.0.2
|
||||||
|
with:
|
||||||
|
path: ~/go/pkg/mod
|
||||||
|
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-go-
|
||||||
|
- name: Login to docker.io registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USER }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Login to ghcr.io registry
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ env.GH_USER }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Login to ECR
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: public.ecr.aws
|
||||||
|
username: ${{ secrets.ECR_ACCESS_KEY_ID }}
|
||||||
|
password: ${{ secrets.ECR_SECRET_ACCESS_KEY }}
|
||||||
|
- name: Generate SBOM
|
||||||
|
uses: CycloneDX/gh-gomod-generate-sbom@v1
|
||||||
|
with:
|
||||||
|
args: mod -licenses -json -output bom.json
|
||||||
|
version: ^v1
|
||||||
|
- name: Release
|
||||||
|
uses: goreleaser/goreleaser-action@v3
|
||||||
|
with:
|
||||||
|
version: v1.4.1
|
||||||
|
args: release --rm-dist --timeout 60m
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.ORG_REPO_TOKEN }}
|
||||||
|
- name: Checkout trivy-repo
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
repository: ${{ github.repository_owner }}/trivy-repo
|
||||||
|
path: trivy-repo
|
||||||
|
fetch-depth: 0
|
||||||
|
token: ${{ secrets.ORG_REPO_TOKEN }}
|
||||||
|
- name: Setup git settings
|
||||||
|
run: |
|
||||||
|
git config --global user.email "knqyf263@gmail.com"
|
||||||
|
git config --global user.name "Teppei Fukuda"
|
||||||
|
- name: Create rpm repository
|
||||||
|
run: ci/deploy-rpm.sh
|
||||||
|
- name: Import GPG key
|
||||||
|
run: echo -e "${{ secrets.GPG_KEY }}" | gpg --import
|
||||||
|
- name: Create deb repository
|
||||||
|
run: ci/deploy-deb.sh
|
||||||
23
.github/workflows/scan.yaml
vendored
Normal file
23
.github/workflows/scan.yaml
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
name: Scan vulnerabilities
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Scan Go vulnerabilities
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Run Trivy vulnerability scanner and create GitHub issues
|
||||||
|
uses: knqyf263/trivy-issue-action@v0.0.4
|
||||||
|
with:
|
||||||
|
assignee: knqyf263
|
||||||
|
severity: CRITICAL
|
||||||
|
skip-dirs: integration,examples
|
||||||
|
label: vulnerability
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
86
.github/workflows/semantic-pr.yaml
vendored
Normal file
86
.github/workflows/semantic-pr.yaml
vendored
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
name: "Lint PR title"
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- opened
|
||||||
|
- edited
|
||||||
|
- synchronize
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
main:
|
||||||
|
name: Validate PR title
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: amannn/action-semantic-pull-request@v4
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
types:
|
||||||
|
feat
|
||||||
|
fix
|
||||||
|
docs
|
||||||
|
style
|
||||||
|
refactor
|
||||||
|
perf
|
||||||
|
test
|
||||||
|
build
|
||||||
|
ci
|
||||||
|
chore
|
||||||
|
revert
|
||||||
|
BREAKING
|
||||||
|
|
||||||
|
scopes:
|
||||||
|
vuln
|
||||||
|
misconf
|
||||||
|
secret
|
||||||
|
|
||||||
|
image
|
||||||
|
fs
|
||||||
|
repo
|
||||||
|
sbom
|
||||||
|
server
|
||||||
|
k8s
|
||||||
|
|
||||||
|
alpine
|
||||||
|
redhat
|
||||||
|
alma
|
||||||
|
rocky
|
||||||
|
mariner
|
||||||
|
oracle
|
||||||
|
debian
|
||||||
|
ubuntu
|
||||||
|
amazon
|
||||||
|
suse
|
||||||
|
photon
|
||||||
|
distroless
|
||||||
|
|
||||||
|
ruby
|
||||||
|
php
|
||||||
|
python
|
||||||
|
nodejs
|
||||||
|
rust
|
||||||
|
dotnet
|
||||||
|
java
|
||||||
|
go
|
||||||
|
|
||||||
|
os
|
||||||
|
lang
|
||||||
|
|
||||||
|
kubernetes
|
||||||
|
dockerfile
|
||||||
|
terraform
|
||||||
|
cloudformation
|
||||||
|
|
||||||
|
docker
|
||||||
|
podman
|
||||||
|
containerd
|
||||||
|
oci
|
||||||
|
|
||||||
|
cli
|
||||||
|
flag
|
||||||
|
|
||||||
|
helm
|
||||||
|
report
|
||||||
|
db
|
||||||
|
deps
|
||||||
20
.github/workflows/stale-issues.yaml
vendored
Normal file
20
.github/workflows/stale-issues.yaml
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
name: "Stale issues"
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
timeout-minutes: 1
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v5
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
stale-issue-message: 'This issue is stale because it has been labeled with inactivity.'
|
||||||
|
stale-pr-message: 'This PR is stale because it has been labeled with inactivity.'
|
||||||
|
exempt-issue-labels: 'lifecycle/frozen,lifecycle/active,priority/critical-urgent,priority/important-soon,priority/important-longterm,priority/backlog,priority/awaiting-more-evidence'
|
||||||
|
exempt-pr-labels: 'lifecycle/active'
|
||||||
|
stale-pr-label: 'lifecycle/stale'
|
||||||
|
stale-issue-label: 'lifecycle/stale'
|
||||||
|
days-before-stale: 60
|
||||||
|
days-before-close: 20
|
||||||
121
.github/workflows/test.yaml
vendored
121
.github/workflows/test.yaml
vendored
@@ -1,36 +1,137 @@
|
|||||||
name: Test
|
name: Test
|
||||||
on: pull_request
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths-ignore:
|
||||||
|
- '*.md'
|
||||||
|
- 'docs/**'
|
||||||
|
- 'mkdocs.yml'
|
||||||
|
- 'LICENSE'
|
||||||
|
pull_request:
|
||||||
|
env:
|
||||||
|
GO_VERSION: "1.18"
|
||||||
|
TINYGO_VERSION: "0.23.0"
|
||||||
jobs:
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
|
||||||
|
- name: go mod tidy
|
||||||
|
run: |
|
||||||
|
go mod tidy
|
||||||
|
if [ -n "$(git status --porcelain)" ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Lint
|
||||||
|
uses: golangci/golangci-lint-action@v3.2.0
|
||||||
|
with:
|
||||||
|
version: v1.45
|
||||||
|
args: --deadline=30m
|
||||||
|
skip-cache: true # https://github.com/golangci/golangci-lint-action/issues/244#issuecomment-1052197778
|
||||||
|
|
||||||
|
- name: Install TinyGo
|
||||||
|
run: |
|
||||||
|
wget https://github.com/tinygo-org/tinygo/releases/download/v${TINYGO_VERSION}/tinygo_${TINYGO_VERSION}_amd64.deb
|
||||||
|
sudo dpkg -i tinygo_${TINYGO_VERSION}_amd64.deb
|
||||||
|
|
||||||
|
- name: Run unit tests
|
||||||
|
run: make test
|
||||||
|
|
||||||
integration:
|
integration:
|
||||||
name: Integration Test
|
name: Integration Test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v1
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: 1.14.x
|
go-version: ${{ env.GO_VERSION }}
|
||||||
id: go
|
id: go
|
||||||
|
|
||||||
- name: Check out code into the Go module directory
|
- name: Check out code into the Go module directory
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Run integration tests
|
- name: Run integration tests
|
||||||
run: make test-integration
|
run: make test-integration
|
||||||
|
|
||||||
|
module-test:
|
||||||
|
name: Module Integration Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
id: go
|
||||||
|
|
||||||
|
- name: Install TinyGo
|
||||||
|
run: |
|
||||||
|
wget https://github.com/tinygo-org/tinygo/releases/download/v${TINYGO_VERSION}/tinygo_${TINYGO_VERSION}_amd64.deb
|
||||||
|
sudo dpkg -i tinygo_${TINYGO_VERSION}_amd64.deb
|
||||||
|
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Run module integration tests
|
||||||
|
run: |
|
||||||
|
make test-module-integration
|
||||||
|
|
||||||
build-test:
|
build-test:
|
||||||
name: Build Test
|
name: Build Test
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
DOCKER_CLI_EXPERIMENTAL: "enabled"
|
||||||
steps:
|
steps:
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
|
- name: Show available Docker Buildx platforms
|
||||||
|
run: echo ${{ steps.buildx.outputs.platforms }}
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v1
|
uses: actions/setup-go@v3
|
||||||
with:
|
with:
|
||||||
go-version: 1.14.x
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
|
||||||
- name: Run GoReleaser
|
- name: Run GoReleaser
|
||||||
uses: goreleaser/goreleaser-action@v1
|
uses: goreleaser/goreleaser-action@v3
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: v1.4.1
|
||||||
args: release --snapshot --rm-dist --skip-publish
|
args: release --snapshot --rm-dist --skip-publish --timeout 60m
|
||||||
|
|
||||||
|
build-documents:
|
||||||
|
name: Documentation Test
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
persist-credentials: true
|
||||||
|
- uses: actions/setup-python@v3
|
||||||
|
with:
|
||||||
|
python-version: 3.x
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
pip install -r docs/build/requirements.txt
|
||||||
|
- name: Configure the git user
|
||||||
|
run: |
|
||||||
|
git config user.name "knqyf263"
|
||||||
|
git config user.email "knqyf263@gmail.com"
|
||||||
|
- name: Deploy the dev documents
|
||||||
|
run: mike deploy test
|
||||||
|
|||||||
16
.gitignore
vendored
16
.gitignore
vendored
@@ -4,6 +4,10 @@
|
|||||||
*.dll
|
*.dll
|
||||||
*.so
|
*.so
|
||||||
*.dylib
|
*.dylib
|
||||||
|
/trivy
|
||||||
|
|
||||||
|
## chart release
|
||||||
|
.cr-release-packages
|
||||||
|
|
||||||
# Test binary, build with `go test -c`
|
# Test binary, build with `go test -c`
|
||||||
*.test
|
*.test
|
||||||
@@ -12,6 +16,7 @@
|
|||||||
*.out
|
*.out
|
||||||
|
|
||||||
.idea
|
.idea
|
||||||
|
.vscode
|
||||||
|
|
||||||
# Directory Cache Files
|
# Directory Cache Files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
@@ -19,4 +24,13 @@ thumbs.db
|
|||||||
|
|
||||||
# test fixtures
|
# test fixtures
|
||||||
coverage.txt
|
coverage.txt
|
||||||
integration/testdata/fixtures/
|
integration/testdata/fixtures/images
|
||||||
|
|
||||||
|
# SBOMs generated during CI
|
||||||
|
/bom.json
|
||||||
|
|
||||||
|
# goreleaser output
|
||||||
|
dist
|
||||||
|
|
||||||
|
# WebAssembly
|
||||||
|
*.wasm
|
||||||
|
|||||||
74
.golangci.yaml
Normal file
74
.golangci.yaml
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
linters-settings:
|
||||||
|
errcheck:
|
||||||
|
check-type-assertions: true
|
||||||
|
check-blank: true
|
||||||
|
govet:
|
||||||
|
check-shadowing: false
|
||||||
|
gofmt:
|
||||||
|
simplify: false
|
||||||
|
revive:
|
||||||
|
ignore-generated-header: true
|
||||||
|
gocyclo:
|
||||||
|
min-complexity: 20
|
||||||
|
dupl:
|
||||||
|
threshold: 100
|
||||||
|
goconst:
|
||||||
|
min-len: 3
|
||||||
|
min-occurrences: 3
|
||||||
|
misspell:
|
||||||
|
locale: US
|
||||||
|
goimports:
|
||||||
|
local-prefixes: github.com/aquasecurity
|
||||||
|
gosec:
|
||||||
|
excludes:
|
||||||
|
- G204
|
||||||
|
- G402
|
||||||
|
|
||||||
|
linters:
|
||||||
|
disable-all: true
|
||||||
|
enable:
|
||||||
|
- structcheck
|
||||||
|
- ineffassign
|
||||||
|
- typecheck
|
||||||
|
- govet
|
||||||
|
- errcheck
|
||||||
|
- varcheck
|
||||||
|
- deadcode
|
||||||
|
- revive
|
||||||
|
- gosec
|
||||||
|
- unconvert
|
||||||
|
- goconst
|
||||||
|
- gocyclo
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
- misspell
|
||||||
|
|
||||||
|
run:
|
||||||
|
go: 1.18
|
||||||
|
skip-files:
|
||||||
|
- ".*._mock.go$"
|
||||||
|
- ".*._test.go$"
|
||||||
|
- "integration/*"
|
||||||
|
- "examples/*"
|
||||||
|
|
||||||
|
issues:
|
||||||
|
exclude-rules:
|
||||||
|
- linters:
|
||||||
|
- gosec
|
||||||
|
text: "G304: Potential file inclusion"
|
||||||
|
- linters:
|
||||||
|
- gosec
|
||||||
|
text: "Deferring unsafe method"
|
||||||
|
- linters:
|
||||||
|
- errcheck
|
||||||
|
text: "Close` is not checked"
|
||||||
|
- linters:
|
||||||
|
- errcheck
|
||||||
|
text: "os.*` is not checked"
|
||||||
|
- linters:
|
||||||
|
- golint
|
||||||
|
text: "a blank import should be only in a main or test package"
|
||||||
|
exclude:
|
||||||
|
- "should have a package comment, unless it's in another file for this package"
|
||||||
|
exclude-use-default: false
|
||||||
|
max-same-issues: 0
|
||||||
@@ -1,28 +1 @@
|
|||||||
Thank you for taking interest in contributing to Trivy !
|
See [Issues](https://aquasecurity.github.io/trivy/latest/community/contribute/issue/) and [Pull Requests](https://aquasecurity.github.io/trivy/latest/community/contribute/pr/)
|
||||||
|
|
||||||
## Issues
|
|
||||||
- Feel free to open issues for any reason. When you open a new issue, you'll have to select an issue kind: bug/feature/support and fill the required information based on the selected template.
|
|
||||||
- Please spend a small amount of time giving due diligence to the issue tracker. Your issue might be a duplicate. If it is, please add your comment to the existing issue.
|
|
||||||
- Remember users might be searching for your issue in the future, so please give it a meaningful title to help others.
|
|
||||||
- The issue should clearly explain the reason for opening, the proposal if you have any, and any relevant technical information.
|
|
||||||
|
|
||||||
## Pull Requests
|
|
||||||
|
|
||||||
1. Every Pull Request should have an associated bug or feature issue unless you are fixing a trivial documentation issue.
|
|
||||||
1. Your PR is more likely to be accepted if it focuses on just one change.
|
|
||||||
1. Describe what the PR does. There's no convention enforced, but please try to be concise and descriptive. Treat the PR description as a commit message. Titles that starts with "fix"/"add"/"improve"/"remove" are good examples.
|
|
||||||
1. Please add the associated Issue in the PR description.
|
|
||||||
1. There's no need to add or tag reviewers.
|
|
||||||
1. If a reviewer commented on your code or asked for changes, please remember to mark the discussion as resolved after you address it. PRs with unresolved issues should not be merged (even if the comment is unclear or requires no action from your side).
|
|
||||||
1. Please include a comment with the results before and after your change.
|
|
||||||
1. Your PR is more likely to be accepted if it includes tests (We have not historically been very strict about tests, but we would like to improve this!).
|
|
||||||
1. If your PR affects the user experience in some way, please update the Readme and the CLI help accordingly.
|
|
||||||
|
|
||||||
## Understand where your pull request belongs
|
|
||||||
|
|
||||||
Trivy is composed of several different repositories that work together:
|
|
||||||
|
|
||||||
- [Trivy](https://github.com/aquasecurity/trivy) is the client-side, user-facing, command line tool.
|
|
||||||
- [vuln-list](https://github.com/aquasecurity/vuln-list) is a vulnerabilities database, aggregated from different sources, and normalized for easy consumption. This of this as the "server" side of the trivy command line tool. **There should be no pull requests to this repo**
|
|
||||||
- [vuln-list-update](https://github.com/aquasecurity/vuln-list-update) is the code that maintains the vuln-list database.
|
|
||||||
- [fanal](https://github.com/aquasecurity/fanal) is a library for extracting system information containers. It is being used by Trivy to find testable subjects in the container image.
|
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
FROM alpine:3.12
|
FROM alpine:3.16.0
|
||||||
RUN apk --no-cache add ca-certificates git rpm
|
RUN apk --no-cache add ca-certificates git
|
||||||
COPY trivy /usr/local/bin/trivy
|
COPY trivy /usr/local/bin/trivy
|
||||||
COPY contrib/gitlab.tpl contrib/gitlab.tpl
|
COPY contrib/*.tpl contrib/
|
||||||
COPY contrib/junit.tpl contrib/junit.tpl
|
|
||||||
COPY contrib/sarif.tpl contrib/sarif.tpl
|
|
||||||
ENTRYPOINT ["trivy"]
|
ENTRYPOINT ["trivy"]
|
||||||
|
|||||||
12
Dockerfile.protoc
Normal file
12
Dockerfile.protoc
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
FROM golang:1.18.2
|
||||||
|
|
||||||
|
# Install protoc (cf. http://google.github.io/proto-lens/installing-protoc.html)
|
||||||
|
ENV PROTOC_ZIP=protoc-3.19.4-linux-x86_64.zip
|
||||||
|
RUN apt-get update && apt-get install -y unzip
|
||||||
|
RUN curl --retry 5 -OL https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/$PROTOC_ZIP \
|
||||||
|
&& unzip -o $PROTOC_ZIP -d /usr/local bin/protoc \
|
||||||
|
&& unzip -o $PROTOC_ZIP -d /usr/local 'include/*' \
|
||||||
|
&& rm -f $PROTOC_ZIP
|
||||||
|
|
||||||
|
RUN go install github.com/twitchtv/twirp/protoc-gen-twirp@v8.1.0
|
||||||
|
RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1
|
||||||
95
Makefile
95
Makefile
@@ -1,18 +1,42 @@
|
|||||||
VERSION := $(shell git describe --tags)
|
VERSION := $(shell git describe --tags --always)
|
||||||
LDFLAGS=-ldflags "-s -w -X=main.version=$(VERSION)"
|
LDFLAGS := -ldflags "-s -w -X=main.version=$(VERSION)"
|
||||||
|
|
||||||
GOPATH=$(shell go env GOPATH)
|
GOPATH := $(shell go env GOPATH)
|
||||||
GOBIN=$(GOPATH)/bin
|
GOBIN := $(GOPATH)/bin
|
||||||
GOSRC=$(GOPATH)/src
|
GOSRC := $(GOPATH)/src
|
||||||
|
|
||||||
|
TEST_MODULE_DIR := pkg/module/testdata
|
||||||
|
TEST_MODULE_SRCS := $(wildcard $(TEST_MODULE_DIR)/*/*.go)
|
||||||
|
TEST_MODULES := $(patsubst %.go,%.wasm,$(TEST_MODULE_SRCS))
|
||||||
|
|
||||||
|
EXAMPLE_MODULE_DIR := examples/module
|
||||||
|
EXAMPLE_MODULE_SRCS := $(wildcard $(EXAMPLE_MODULE_DIR)/*/*.go)
|
||||||
|
EXAMPLE_MODULES := $(patsubst %.go,%.wasm,$(EXAMPLE_MODULE_SRCS))
|
||||||
|
|
||||||
|
MKDOCS_IMAGE := aquasec/mkdocs-material:dev
|
||||||
|
MKDOCS_PORT := 8000
|
||||||
|
|
||||||
u := $(if $(update),-u)
|
u := $(if $(update),-u)
|
||||||
|
|
||||||
|
# Tools
|
||||||
$(GOBIN)/wire:
|
$(GOBIN)/wire:
|
||||||
GO111MODULE=off go get github.com/google/wire/cmd/wire
|
go install github.com/google/wire/cmd/wire@v0.5.0
|
||||||
|
|
||||||
|
$(GOBIN)/crane:
|
||||||
|
go install github.com/google/go-containerregistry/cmd/crane@v0.9.0
|
||||||
|
|
||||||
|
$(GOBIN)/golangci-lint:
|
||||||
|
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(GOBIN) v1.45.2
|
||||||
|
|
||||||
|
$(GOBIN)/labeler:
|
||||||
|
go install github.com/knqyf263/labeler@latest
|
||||||
|
|
||||||
|
$(GOBIN)/easyjson:
|
||||||
|
go install github.com/mailru/easyjson/...@v0.7.7
|
||||||
|
|
||||||
.PHONY: wire
|
.PHONY: wire
|
||||||
wire: $(GOBIN)/wire
|
wire: $(GOBIN)/wire
|
||||||
wire gen ./pkg/... ./internal/...
|
wire gen ./pkg/commands/... ./pkg/rpc/...
|
||||||
|
|
||||||
.PHONY: mock
|
.PHONY: mock
|
||||||
mock: $(GOBIN)/mockery
|
mock: $(GOBIN)/mockery
|
||||||
@@ -23,23 +47,39 @@ deps:
|
|||||||
go get ${u} -d
|
go get ${u} -d
|
||||||
go mod tidy
|
go mod tidy
|
||||||
|
|
||||||
$(GOBIN)/golangci-lint:
|
.PHONY: generate-test-modules
|
||||||
curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(GOBIN) v1.21.0
|
generate-test-modules: $(TEST_MODULES)
|
||||||
|
|
||||||
|
# Compile WASM modules for unit and integration tests
|
||||||
|
%.wasm:%.go
|
||||||
|
@if !(type "tinygo" > /dev/null 2>&1); then \
|
||||||
|
echo "Need to install TinyGo. Follow https://tinygo.org/getting-started/install/"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
go generate $<
|
||||||
|
|
||||||
|
# Run unit tests
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test:
|
test: $(TEST_MODULES)
|
||||||
go test -v -short -coverprofile=coverage.txt -covermode=atomic ./...
|
go test -v -short -coverprofile=coverage.txt -covermode=atomic ./...
|
||||||
|
|
||||||
integration/testdata/fixtures/*.tar.gz:
|
integration/testdata/fixtures/images/*.tar.gz: $(GOBIN)/crane
|
||||||
git clone https://github.com/aquasecurity/trivy-test-images.git integration/testdata/fixtures
|
mkdir -p integration/testdata/fixtures/images/
|
||||||
|
integration/scripts/download-images.sh
|
||||||
|
|
||||||
|
# Run integration tests
|
||||||
.PHONY: test-integration
|
.PHONY: test-integration
|
||||||
test-integration: integration/testdata/fixtures/*.tar.gz
|
test-integration: integration/testdata/fixtures/images/*.tar.gz
|
||||||
go test -v -tags=integration ./integration/...
|
go test -v -tags=integration ./integration/... ./pkg/fanal/test/integration/...
|
||||||
|
|
||||||
|
# Run WASM integration tests
|
||||||
|
.PHONY: test-module-integration
|
||||||
|
test-module-integration: integration/testdata/fixtures/images/*.tar.gz $(EXAMPLE_MODULES)
|
||||||
|
go test -v -tags=module_integration ./integration/...
|
||||||
|
|
||||||
.PHONY: lint
|
.PHONY: lint
|
||||||
lint: $(GOBIN)/golangci-lint
|
lint: $(GOBIN)/golangci-lint
|
||||||
$(GOBIN)/golangci-lint run
|
$(GOBIN)/golangci-lint run --timeout 5m
|
||||||
|
|
||||||
.PHONY: fmt
|
.PHONY: fmt
|
||||||
fmt:
|
fmt:
|
||||||
@@ -51,7 +91,13 @@ build:
|
|||||||
|
|
||||||
.PHONY: protoc
|
.PHONY: protoc
|
||||||
protoc:
|
protoc:
|
||||||
find ./rpc/ -name "*.proto" -type f -exec protoc --proto_path=$(GOSRC):. --twirp_out=. --go_out=. {} \;
|
docker build -t trivy-protoc - < Dockerfile.protoc
|
||||||
|
docker run --rm -it -v ${PWD}:/app -w /app trivy-protoc make _$@
|
||||||
|
|
||||||
|
_protoc:
|
||||||
|
for path in `find ./rpc/ -name "*.proto" -type f`; do \
|
||||||
|
protoc --twirp_out=. --twirp_opt=paths=source_relative --go_out=. --go_opt=paths=source_relative $${path} || exit; \
|
||||||
|
done
|
||||||
|
|
||||||
.PHONY: install
|
.PHONY: install
|
||||||
install:
|
install:
|
||||||
@@ -59,11 +105,20 @@ install:
|
|||||||
|
|
||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
rm -rf integration/testdata/fixtures/
|
rm -rf integration/testdata/fixtures/images
|
||||||
|
|
||||||
$(GOBIN)/labeler:
|
|
||||||
GO111MODULE=off go get github.com/knqyf263/labeler
|
|
||||||
|
|
||||||
|
# Create labels on GitHub
|
||||||
.PHONY: label
|
.PHONY: label
|
||||||
label: $(GOBIN)/labeler
|
label: $(GOBIN)/labeler
|
||||||
labeler apply misc/triage/labels.yaml -r aquasecurity/trivy -l 5
|
labeler apply misc/triage/labels.yaml -r aquasecurity/trivy -l 5
|
||||||
|
|
||||||
|
# Run MkDocs development server to preview the documentation page
|
||||||
|
.PHONY: mkdocs-serve
|
||||||
|
mkdocs-serve:
|
||||||
|
docker build -t $(MKDOCS_IMAGE) -f docs/build/Dockerfile docs/build
|
||||||
|
docker run --name mkdocs-serve --rm -v $(PWD):/docs -p $(MKDOCS_PORT):8000 $(MKDOCS_IMAGE)
|
||||||
|
|
||||||
|
# Generate JSON marshaler/unmarshaler for TinyGo/WebAssembly as TinyGo doesn't support encoding/json.
|
||||||
|
.PHONY: easyjson
|
||||||
|
easyjson: $(GOBIN)/easyjson
|
||||||
|
easyjson pkg/module/serialize/types.go
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
FROM circleci/golang:1.13-buster
|
|
||||||
|
|
||||||
RUN sudo apt-get -y update \
|
|
||||||
&& sudo apt-get -y install rpm reprepro createrepo distro-info
|
|
||||||
|
|
||||||
ARG GORELEASER_VERSION=0.124.1
|
|
||||||
ARG GORELEASER_ARTIFACT=goreleaser_Linux_x86_64.tar.gz
|
|
||||||
RUN wget https://github.com/goreleaser/goreleaser/releases/download/v${GORELEASER_VERSION}/${GORELEASER_ARTIFACT} \
|
|
||||||
&& sudo tar -xzf ${GORELEASER_ARTIFACT} -C /usr/bin/ goreleaser \
|
|
||||||
&& rm ${GORELEASER_ARTIFACT}
|
|
||||||
@@ -1,22 +1,24 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
DEBIAN_RELEASES=$(debian-distro-info --supported)
|
DEBIAN_RELEASES=$(debian-distro-info --supported)
|
||||||
UBUNTU_RELEASES=$(ubuntu-distro-info --supported)
|
UBUNTU_RELEASES=$(sort -u <(ubuntu-distro-info --supported-esm) <(ubuntu-distro-info --supported))
|
||||||
|
|
||||||
cd trivy-repo/deb
|
cd trivy-repo/deb
|
||||||
|
|
||||||
for release in $(reprepro ls trivy | awk -F "|" '{print $3}' | sed 's/ //g'); do
|
for release in ${DEBIAN_RELEASES[@]} ${UBUNTU_RELEASES[@]}; do
|
||||||
echo "Removing deb package of $release"
|
echo "Removing deb package of $release"
|
||||||
reprepro -A i386 remove $release trivy
|
reprepro -A i386 remove $release trivy
|
||||||
reprepro -A amd64 remove $release trivy
|
reprepro -A amd64 remove $release trivy
|
||||||
|
reprepro -A arm64 remove $release trivy
|
||||||
done
|
done
|
||||||
|
|
||||||
for release in ${DEBIAN_RELEASES[@]} ${UBUNTU_RELEASES[@]}; do
|
for release in ${DEBIAN_RELEASES[@]} ${UBUNTU_RELEASES[@]}; do
|
||||||
echo "Adding deb package to $release"
|
echo "Adding deb package to $release"
|
||||||
reprepro includedeb $release ../../dist/*Linux-64bit.deb
|
reprepro includedeb $release ../../dist/*Linux-64bit.deb
|
||||||
reprepro includedeb $release ../../dist/*Linux-32bit.deb
|
reprepro includedeb $release ../../dist/*Linux-32bit.deb
|
||||||
|
reprepro includedeb $release ../../dist/*Linux-ARM64.deb
|
||||||
done
|
done
|
||||||
|
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Update deb packages"
|
git commit -m "Update deb packages"
|
||||||
git push origin master
|
git push origin main
|
||||||
|
|||||||
@@ -23,5 +23,5 @@ done
|
|||||||
|
|
||||||
git add .
|
git add .
|
||||||
git commit -m "Update rpm packages"
|
git commit -m "Update rpm packages"
|
||||||
git push origin master
|
git push origin main
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,9 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
l "log"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/aquasecurity/trivy/internal"
|
"github.com/aquasecurity/trivy/pkg/commands"
|
||||||
|
|
||||||
"github.com/aquasecurity/trivy/pkg/log"
|
"github.com/aquasecurity/trivy/pkg/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,12 +12,9 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
app := internal.NewApp(version)
|
app := commands.NewApp(version)
|
||||||
err := app.Run(os.Args)
|
err := app.Run(os.Args)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if log.Logger != nil {
|
log.Fatal(err)
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
l.Fatal(err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
codecov.yml
12
codecov.yml
@@ -1,12 +0,0 @@
|
|||||||
coverage:
|
|
||||||
status:
|
|
||||||
project:
|
|
||||||
default:
|
|
||||||
informational: true
|
|
||||||
target: auto
|
|
||||||
threshold: 100%
|
|
||||||
patch:
|
|
||||||
default:
|
|
||||||
informational: true
|
|
||||||
target: auto
|
|
||||||
threshold: 100%
|
|
||||||
@@ -10,10 +10,10 @@ Trivy_container_scanning:
|
|||||||
IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
|
IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA"
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
before_script:
|
before_script:
|
||||||
- export TRIVY_VERSION=${TRIVY_VERSION:-v0.4.3}
|
- export TRIVY_VERSION=${TRIVY_VERSION:-v0.19.2}
|
||||||
- apk add --no-cache curl docker-cli
|
- apk add --no-cache curl docker-cli
|
||||||
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
|
||||||
- curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin ${TRIVY_VERSION}
|
- curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin ${TRIVY_VERSION}
|
||||||
- curl -sSL -o /tmp/trivy-gitlab.tpl https://github.com/aquasecurity/trivy/raw/${TRIVY_VERSION}/contrib/gitlab.tpl
|
- curl -sSL -o /tmp/trivy-gitlab.tpl https://github.com/aquasecurity/trivy/raw/${TRIVY_VERSION}/contrib/gitlab.tpl
|
||||||
script:
|
script:
|
||||||
- trivy --exit-code 0 --cache-dir .trivycache/ --no-progress --format template --template "@/tmp/trivy-gitlab.tpl" -o gl-container-scanning-report.json $IMAGE
|
- trivy --exit-code 0 --cache-dir .trivycache/ --no-progress --format template --template "@/tmp/trivy-gitlab.tpl" -o gl-container-scanning-report.json $IMAGE
|
||||||
|
|||||||
198
contrib/asff.tpl
198
contrib/asff.tpl
@@ -1,78 +1,124 @@
|
|||||||
[
|
{
|
||||||
{{- $t_first := true -}}
|
"Findings": [
|
||||||
{{- range . -}}
|
{{- $t_first := true -}}
|
||||||
{{- $target := .Target -}}
|
{{- range . -}}
|
||||||
{{- range .Vulnerabilities -}}
|
{{- $target := .Target -}}
|
||||||
{{- if $t_first -}}
|
{{- $image := .Target -}}
|
||||||
{{- $t_first = false -}}
|
{{- if gt (len $image) 127 -}}
|
||||||
{{- else -}}
|
{{- $image = $image | regexFind ".{124}$" | printf "...%v" -}}
|
||||||
,
|
{{- end}}
|
||||||
{{- end -}}
|
{{- range .Vulnerabilities -}}
|
||||||
{{- $trivyProductSev := 0 -}}
|
{{- if $t_first -}}
|
||||||
{{- $trivyNormalizedSev := 0 -}}
|
{{- $t_first = false -}}
|
||||||
{{- if eq .Severity "LOW" -}}
|
{{- else -}}
|
||||||
{{- $trivyProductSev = 1 -}}
|
,
|
||||||
{{- $trivyNormalizedSev = 10 -}}
|
{{- end -}}
|
||||||
{{- else if eq .Severity "MEDIUM" -}}
|
{{- $severity := .Severity -}}
|
||||||
{{- $trivyProductSev = 4 -}}
|
{{- if eq $severity "UNKNOWN" -}}
|
||||||
{{- $trivyNormalizedSev = 40 -}}
|
{{- $severity = "INFORMATIONAL" -}}
|
||||||
{{- else if eq .Severity "HIGH" -}}
|
{{- end -}}
|
||||||
{{- $trivyProductSev = 7 -}}
|
{{- $description := .Description -}}
|
||||||
{{- $trivyNormalizedSev = 70 -}}
|
{{- if gt (len $description ) 512 -}}
|
||||||
{{- else if eq .Severity "CRITICAL" -}}
|
{{- $description = (substr 0 512 $description) | printf "%v .." -}}
|
||||||
{{- $trivyProductSev = 9 -}}
|
{{- end}}
|
||||||
{{- $trivyNormalizedSev = 90 -}}
|
{
|
||||||
{{- end }}
|
"SchemaVersion": "2018-10-08",
|
||||||
{{- $description := .Description -}}
|
"Id": "{{ $target }}/{{ .VulnerabilityID }}",
|
||||||
{{- if gt (len $description ) 1021 -}}
|
"ProductArn": "arn:aws:securityhub:{{ env "AWS_REGION" }}::product/aquasecurity/aquasecurity",
|
||||||
{{- $description = (slice $description 0 1021) | printf "%v .." -}}
|
"GeneratorId": "Trivy/{{ .VulnerabilityID }}",
|
||||||
{{- end}}
|
"AwsAccountId": "{{ env "AWS_ACCOUNT_ID" }}",
|
||||||
{
|
"Types": [ "Software and Configuration Checks/Vulnerabilities/CVE" ],
|
||||||
"SchemaVersion": "2018-10-08",
|
"CreatedAt": "{{ now | date "2006-01-02T15:04:05.999999999Z07:00" }}",
|
||||||
"Id": "{{ $target }}/{{ .VulnerabilityID }}",
|
"UpdatedAt": "{{ now | date "2006-01-02T15:04:05.999999999Z07:00" }}",
|
||||||
"ProductArn": "arn:aws:securityhub:{{ getEnv "AWS_REGION" }}::product/aquasecurity/aquasecurity",
|
"Severity": {
|
||||||
"GeneratorId": "Trivy",
|
"Label": "{{ $severity }}"
|
||||||
"AwsAccountId": "{{ getEnv "AWS_ACCOUNT_ID" }}",
|
},
|
||||||
"Types": [ "Software and Configuration Checks/Vulnerabilities/CVE" ],
|
"Title": "Trivy found a vulnerability to {{ .VulnerabilityID }} in container {{ $target }}",
|
||||||
"CreatedAt": "{{ getCurrentTime }}",
|
"Description": {{ escapeString $description | printf "%q" }},
|
||||||
"UpdatedAt": "{{ getCurrentTime }}",
|
{{ if not (empty .PrimaryURL) -}}
|
||||||
"Severity": {
|
"Remediation": {
|
||||||
"Product": {{ $trivyProductSev }},
|
"Recommendation": {
|
||||||
"Normalized": {{ $trivyNormalizedSev }}
|
"Text": "More information on this vulnerability is provided in the hyperlink",
|
||||||
},
|
"Url": "{{ .PrimaryURL }}"
|
||||||
"Title": "Trivy found a vulnerability to {{ .VulnerabilityID }} in container {{ $target }}",
|
}
|
||||||
"Description": {{ escapeString $description | printf "%q" }},
|
},
|
||||||
"Remediation": {
|
{{ end -}}
|
||||||
"Recommendation": {
|
"ProductFields": { "Product Name": "Trivy" },
|
||||||
"Text": "More information on this vulnerability is provided in the hyperlink",
|
"Resources": [
|
||||||
"Url": "{{ index .References 0 }}"
|
{
|
||||||
}
|
"Type": "Container",
|
||||||
},
|
"Id": "{{ $target }}",
|
||||||
"ProductFields": { "Product Name": "Trivy" },
|
"Partition": "aws",
|
||||||
"Resources": [
|
"Region": "{{ env "AWS_REGION" }}",
|
||||||
{
|
"Details": {
|
||||||
"Type": "Container",
|
"Container": { "ImageName": "{{ $image }}" },
|
||||||
"Id": "{{ $target }}",
|
"Other": {
|
||||||
"Partition": "aws",
|
"CVE ID": "{{ .VulnerabilityID }}",
|
||||||
"Region": "{{ getEnv "AWS_REGION" }}",
|
"CVE Title": {{ .Title | printf "%q" }},
|
||||||
"Details": {
|
"PkgName": "{{ .PkgName }}",
|
||||||
"Container": { "ImageName": "{{ $target }}" },
|
"Installed Package": "{{ .InstalledVersion }}",
|
||||||
"Other": {
|
"Patched Package": "{{ .FixedVersion }}",
|
||||||
"CVE ID": "{{ .VulnerabilityID }}",
|
"NvdCvssScoreV3": "{{ (index .CVSS (sourceID "nvd")).V3Score }}",
|
||||||
"CVE Title": {{ .Title | printf "%q" }},
|
"NvdCvssVectorV3": "{{ (index .CVSS (sourceID "nvd")).V3Vector }}",
|
||||||
"PkgName": "{{ .PkgName }}",
|
"NvdCvssScoreV2": "{{ (index .CVSS (sourceID "nvd")).V2Score }}",
|
||||||
"Installed Package": "{{ .InstalledVersion }}",
|
"NvdCvssVectorV2": "{{ (index .CVSS (sourceID "nvd")).V2Vector }}"
|
||||||
"Patched Package": "{{ .FixedVersion }}",
|
}
|
||||||
"NvdCvssScoreV3": "{{ (index .CVSS "nvd").V3Score }}",
|
|
||||||
"NvdCvssVectorV3": "{{ (index .CVSS "nvd").V3Vector }}",
|
|
||||||
"NvdCvssScoreV2": "{{ (index .CVSS "nvd").V2Score }}",
|
|
||||||
"NvdCvssVectorV2": "{{ (index .CVSS "nvd").V2Vector }}"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
],
|
||||||
],
|
"RecordState": "ACTIVE"
|
||||||
"RecordState": "ACTIVE"
|
}
|
||||||
}
|
{{- end -}}
|
||||||
{{- end -}}
|
{{- range .Misconfigurations -}}
|
||||||
{{- end }}
|
{{- if $t_first -}}{{- $t_first = false -}}{{- else -}},{{- end -}}
|
||||||
]
|
{{- $severity := .Severity -}}
|
||||||
|
{{- if eq $severity "UNKNOWN" -}}
|
||||||
|
{{- $severity = "INFORMATIONAL" -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- $description := .Description -}}
|
||||||
|
{{- if gt (len $description ) 512 -}}
|
||||||
|
{{- $description = (substr 0 512 $description) | printf "%v .." -}}
|
||||||
|
{{- end}}
|
||||||
|
{
|
||||||
|
"SchemaVersion": "2018-10-08",
|
||||||
|
"Id": "{{ $target }}/{{ .ID }}",
|
||||||
|
"ProductArn": "arn:aws:securityhub:{{ env "AWS_REGION" }}::product/aquasecurity/aquasecurity",
|
||||||
|
"GeneratorId": "Trivy/{{ .ID }}",
|
||||||
|
"AwsAccountId": "{{ env "AWS_ACCOUNT_ID" }}",
|
||||||
|
"Types": [ "Software and Configuration Checks" ],
|
||||||
|
"CreatedAt": "{{ now | date "2006-01-02T15:04:05.999999999Z07:00" }}",
|
||||||
|
"UpdatedAt": "{{ now | date "2006-01-02T15:04:05.999999999Z07:00" }}",
|
||||||
|
"Severity": {
|
||||||
|
"Label": "{{ $severity }}"
|
||||||
|
},
|
||||||
|
"Title": "Trivy found a misconfiguration in {{ $target }}: {{ .Title }}",
|
||||||
|
"Description": {{ escapeString $description | printf "%q" }},
|
||||||
|
"Remediation": {
|
||||||
|
"Recommendation": {
|
||||||
|
"Text": "{{ .Resolution }}",
|
||||||
|
"Url": "{{ .PrimaryURL }}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ProductFields": { "Product Name": "Trivy" },
|
||||||
|
"Resources": [
|
||||||
|
{
|
||||||
|
"Type": "Other",
|
||||||
|
"Id": "{{ $target }}",
|
||||||
|
"Partition": "aws",
|
||||||
|
"Region": "{{ env "AWS_REGION" }}",
|
||||||
|
"Details": {
|
||||||
|
"Other": {
|
||||||
|
"Message": "{{ .Message }}",
|
||||||
|
"Filename": "{{ $target }}",
|
||||||
|
"StartLine": "{{ .CauseMetadata.StartLine }}",
|
||||||
|
"EndLine": "{{ .CauseMetadata.EndLine }}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"RecordState": "ACTIVE"
|
||||||
|
}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,30 +5,42 @@ import data.lib.trivy
|
|||||||
default ignore = false
|
default ignore = false
|
||||||
|
|
||||||
nvd_v3_vector = v {
|
nvd_v3_vector = v {
|
||||||
v := input.CVSS.nvd.v3
|
v := input.CVSS.nvd.V3Vector
|
||||||
|
}
|
||||||
|
|
||||||
|
redhat_v3_vector = v {
|
||||||
|
v := input.CVSS.redhat.V3Vector
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ignore a vulnerability which requires high privilege
|
# Ignore a vulnerability which requires high privilege
|
||||||
ignore {
|
ignore {
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
cvss_vector.PrivilegesRequired == "High"
|
nvd_cvss_vector.PrivilegesRequired == "High"
|
||||||
|
|
||||||
|
# Check against RedHat scores as well as NVD
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.PrivilegesRequired == "High"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ignore a vulnerability which requires user interaction
|
# Ignore a vulnerability which requires user interaction
|
||||||
ignore {
|
ignore {
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
cvss_vector.UserInteraction == "Required"
|
nvd_cvss_vector.UserInteraction == "Required"
|
||||||
|
|
||||||
|
# Check against RedHat scores as well as NVD
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.UserInteraction == "Required"
|
||||||
}
|
}
|
||||||
|
|
||||||
ignore {
|
ignore {
|
||||||
input.PkgName == "openssl"
|
input.PkgName == "openssl"
|
||||||
|
|
||||||
# Split CVSSv3 vector
|
# Split CVSSv3 vector
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
|
||||||
# Evaluate Attack Vector
|
# Evaluate Attack Vector
|
||||||
ignore_attack_vectors := {"Physical", "Local"}
|
ignore_attack_vectors := {"Physical", "Local"}
|
||||||
cvss_vector.AttackVector == ignore_attack_vectors[_]
|
nvd_cvss_vector.AttackVector == ignore_attack_vectors[_]
|
||||||
}
|
}
|
||||||
|
|
||||||
ignore {
|
ignore {
|
||||||
@@ -50,11 +62,11 @@ ignore {
|
|||||||
input.PkgName == "bash"
|
input.PkgName == "bash"
|
||||||
|
|
||||||
# Split CVSSv3 vector
|
# Split CVSSv3 vector
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
|
||||||
# Evaluate Attack Vector
|
# Evaluate Attack Vector
|
||||||
ignore_attack_vectors := {"Physical", "Local", "Adjacent"}
|
ignore_attack_vectors := {"Physical", "Local", "Adjacent"}
|
||||||
cvss_vector.AttackVector == ignore_attack_vectors[_]
|
nvd_cvss_vector.AttackVector == ignore_attack_vectors[_]
|
||||||
|
|
||||||
# Evaluate severity
|
# Evaluate severity
|
||||||
input.Severity == {"LOW", "MEDIUM", "HIGH"}[_]
|
input.Severity == {"LOW", "MEDIUM", "HIGH"}[_]
|
||||||
@@ -64,11 +76,11 @@ ignore {
|
|||||||
input.PkgName == "django"
|
input.PkgName == "django"
|
||||||
|
|
||||||
# Split CVSSv3 vector
|
# Split CVSSv3 vector
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
|
||||||
# Evaluate Attack Vector
|
# Evaluate Attack Vector
|
||||||
ignore_attack_vectors := {"Physical", "Local"}
|
ignore_attack_vectors := {"Physical", "Local"}
|
||||||
cvss_vector.AttackVector == ignore_attack_vectors[_]
|
nvd_cvss_vector.AttackVector == ignore_attack_vectors[_]
|
||||||
|
|
||||||
# Evaluate severity
|
# Evaluate severity
|
||||||
input.Severity == {"LOW", "MEDIUM"}[_]
|
input.Severity == {"LOW", "MEDIUM"}[_]
|
||||||
@@ -86,7 +98,7 @@ ignore {
|
|||||||
input.PkgName == "jquery"
|
input.PkgName == "jquery"
|
||||||
|
|
||||||
# Split CVSSv3 vector
|
# Split CVSSv3 vector
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
|
|
||||||
# Evaluate CWE-ID
|
# Evaluate CWE-ID
|
||||||
deny_cwe_ids := {"CWE-79"} # XSS
|
deny_cwe_ids := {"CWE-79"} # XSS
|
||||||
|
|||||||
@@ -9,7 +9,11 @@ ignore_pkgs := {"bash", "bind-license", "rpm", "vim", "vim-minimal"}
|
|||||||
ignore_severities := {"LOW", "MEDIUM"}
|
ignore_severities := {"LOW", "MEDIUM"}
|
||||||
|
|
||||||
nvd_v3_vector = v {
|
nvd_v3_vector = v {
|
||||||
v := input.CVSS.nvd.v3
|
v := input.CVSS.nvd.V3Vector
|
||||||
|
}
|
||||||
|
|
||||||
|
redhat_v3_vector = v {
|
||||||
|
v := input.CVSS.redhat.V3Vector
|
||||||
}
|
}
|
||||||
|
|
||||||
ignore {
|
ignore {
|
||||||
@@ -22,20 +26,29 @@ ignore {
|
|||||||
|
|
||||||
# Ignore a vulnerability which is not remotely exploitable
|
# Ignore a vulnerability which is not remotely exploitable
|
||||||
ignore {
|
ignore {
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
cvss_vector.AttackVector != "Network"
|
nvd_cvss_vector.AttackVector != "Network"
|
||||||
|
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.AttackVector != "Network"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ignore a vulnerability which requires high privilege
|
# Ignore a vulnerability which requires high privilege
|
||||||
ignore {
|
ignore {
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
cvss_vector.PrivilegesRequired == "High"
|
nvd_cvss_vector.PrivilegesRequired == "High"
|
||||||
|
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.PrivilegesRequired == "High"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ignore a vulnerability which requires user interaction
|
# Ignore a vulnerability which requires user interaction
|
||||||
ignore {
|
ignore {
|
||||||
cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
nvd_cvss_vector := trivy.parse_cvss_vector_v3(nvd_v3_vector)
|
||||||
cvss_vector.UserInteraction == "Required"
|
nvd_cvss_vector.UserInteraction == "Required"
|
||||||
|
|
||||||
|
redhat_cvss_vector := trivy.parse_cvss_vector_v3(redhat_v3_vector)
|
||||||
|
redhat_cvss_vector.UserInteraction == "Required"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ignore CSRF
|
# Ignore CSRF
|
||||||
|
|||||||
71
contrib/gitlab-codequality.tpl
Normal file
71
contrib/gitlab-codequality.tpl
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
{{- /* Template based on https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#data-types */ -}}
|
||||||
|
[
|
||||||
|
{{- $t_first := true }}
|
||||||
|
{{- range . }}
|
||||||
|
{{- $target := .Target }}
|
||||||
|
{{- range .Vulnerabilities -}}
|
||||||
|
{{- if $t_first -}}
|
||||||
|
{{- $t_first = false -}}
|
||||||
|
{{ else -}}
|
||||||
|
,
|
||||||
|
{{- end }}
|
||||||
|
{
|
||||||
|
"type": "issue",
|
||||||
|
"check_name": "container_scanning",
|
||||||
|
"categories": [ "Security" ],
|
||||||
|
"description": {{ list .VulnerabilityID .PkgName .InstalledVersion .Title | join " - " | printf "%q" }},
|
||||||
|
"fingerprint": "{{ list .VulnerabilityID .PkgName .InstalledVersion $target | join "" | sha1sum }}",
|
||||||
|
"content": {{ .Description | printf "%q" }},
|
||||||
|
"severity": {{ if eq .Severity "LOW" -}}
|
||||||
|
"info"
|
||||||
|
{{- else if eq .Severity "MEDIUM" -}}
|
||||||
|
"minor"
|
||||||
|
{{- else if eq .Severity "HIGH" -}}
|
||||||
|
"major"
|
||||||
|
{{- else if eq .Severity "CRITICAL" -}}
|
||||||
|
"critical"
|
||||||
|
{{- else -}}
|
||||||
|
"info"
|
||||||
|
{{- end }},
|
||||||
|
"location": {
|
||||||
|
"path": "{{ $target }}",
|
||||||
|
"lines": {
|
||||||
|
"begin": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{- end -}}
|
||||||
|
{{- range .Misconfigurations -}}
|
||||||
|
{{- if $t_first -}}
|
||||||
|
{{- $t_first = false -}}
|
||||||
|
{{ else -}}
|
||||||
|
,
|
||||||
|
{{- end }}
|
||||||
|
{
|
||||||
|
"type": "issue",
|
||||||
|
"check_name": "container_scanning",
|
||||||
|
"categories": [ "Security" ],
|
||||||
|
"description": {{ list .ID .Title | join ": " | printf "%q" }},
|
||||||
|
"fingerprint": "{{ list .ID .Title $target | join "" | sha1sum }}",
|
||||||
|
"content": {{ .Description | printf "%q" }},
|
||||||
|
"severity": {{ if eq .Severity "LOW" -}}
|
||||||
|
"info"
|
||||||
|
{{- else if eq .Severity "MEDIUM" -}}
|
||||||
|
"minor"
|
||||||
|
{{- else if eq .Severity "HIGH" -}}
|
||||||
|
"major"
|
||||||
|
{{- else if eq .Severity "CRITICAL" -}}
|
||||||
|
"critical"
|
||||||
|
{{- else -}}
|
||||||
|
"info"
|
||||||
|
{{- end }},
|
||||||
|
"location": {
|
||||||
|
"path": "{{ $target }}",
|
||||||
|
"lines": {
|
||||||
|
"begin": {{ .CauseMetadata.StartLine }}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end }}
|
||||||
|
]
|
||||||
@@ -59,7 +59,7 @@
|
|||||||
"type": "cve",
|
"type": "cve",
|
||||||
"name": "{{ .VulnerabilityID }}",
|
"name": "{{ .VulnerabilityID }}",
|
||||||
"value": "{{ .VulnerabilityID }}",
|
"value": "{{ .VulnerabilityID }}",
|
||||||
"url": ""
|
"url": "{{ .PrimaryURL }}"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"links": [
|
"links": [
|
||||||
|
|||||||
148
contrib/html.tpl
Normal file
148
contrib/html.tpl
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
{{- if . }}
|
||||||
|
<style>
|
||||||
|
* {
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.group-header th {
|
||||||
|
font-size: 200%;
|
||||||
|
}
|
||||||
|
.sub-header th {
|
||||||
|
font-size: 150%;
|
||||||
|
}
|
||||||
|
table, th, td {
|
||||||
|
border: 1px solid black;
|
||||||
|
border-collapse: collapse;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding: .3em;
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.severity {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #fafafa;
|
||||||
|
}
|
||||||
|
.severity-LOW .severity { background-color: #5fbb31; }
|
||||||
|
.severity-MEDIUM .severity { background-color: #e9c600; }
|
||||||
|
.severity-HIGH .severity { background-color: #ff8800; }
|
||||||
|
.severity-CRITICAL .severity { background-color: #e40000; }
|
||||||
|
.severity-UNKNOWN .severity { background-color: #747474; }
|
||||||
|
.severity-LOW { background-color: #5fbb3160; }
|
||||||
|
.severity-MEDIUM { background-color: #e9c60060; }
|
||||||
|
.severity-HIGH { background-color: #ff880060; }
|
||||||
|
.severity-CRITICAL { background-color: #e4000060; }
|
||||||
|
.severity-UNKNOWN { background-color: #74747460; }
|
||||||
|
table tr td:first-of-type {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.links a,
|
||||||
|
.links[data-more-links=on] a {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.links[data-more-links=off] a:nth-of-type(1n+5) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
a.toggle-more-links { cursor: pointer; }
|
||||||
|
</style>
|
||||||
|
<title>{{- escapeXML ( index . 0 ).Target }} - Trivy Report - {{ now }} </title>
|
||||||
|
<script>
|
||||||
|
window.onload = function() {
|
||||||
|
document.querySelectorAll('td.links').forEach(function(linkCell) {
|
||||||
|
var links = [].concat.apply([], linkCell.querySelectorAll('a'));
|
||||||
|
[].sort.apply(links, function(a, b) {
|
||||||
|
return a.href > b.href ? 1 : -1;
|
||||||
|
});
|
||||||
|
links.forEach(function(link, idx) {
|
||||||
|
if (links.length > 3 && 3 === idx) {
|
||||||
|
var toggleLink = document.createElement('a');
|
||||||
|
toggleLink.innerText = "Toggle more links";
|
||||||
|
toggleLink.href = "#toggleMore";
|
||||||
|
toggleLink.setAttribute("class", "toggle-more-links");
|
||||||
|
linkCell.appendChild(toggleLink);
|
||||||
|
}
|
||||||
|
linkCell.appendChild(link);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
document.querySelectorAll('a.toggle-more-links').forEach(function(toggleLink) {
|
||||||
|
toggleLink.onclick = function() {
|
||||||
|
var expanded = toggleLink.parentElement.getAttribute("data-more-links");
|
||||||
|
toggleLink.parentElement.setAttribute("data-more-links", "on" === expanded ? "off" : "on");
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>{{- escapeXML ( index . 0 ).Target }} - Trivy Report - {{ now }}</h1>
|
||||||
|
<table>
|
||||||
|
{{- range . }}
|
||||||
|
<tr class="group-header"><th colspan="6">{{ escapeXML .Type }}</th></tr>
|
||||||
|
{{- if (eq (len .Vulnerabilities) 0) }}
|
||||||
|
<tr><th colspan="6">No Vulnerabilities found</th></tr>
|
||||||
|
{{- else }}
|
||||||
|
<tr class="sub-header">
|
||||||
|
<th>Package</th>
|
||||||
|
<th>Vulnerability ID</th>
|
||||||
|
<th>Severity</th>
|
||||||
|
<th>Installed Version</th>
|
||||||
|
<th>Fixed Version</th>
|
||||||
|
<th>Links</th>
|
||||||
|
</tr>
|
||||||
|
{{- range .Vulnerabilities }}
|
||||||
|
<tr class="severity-{{ escapeXML .Vulnerability.Severity }}">
|
||||||
|
<td class="pkg-name">{{ escapeXML .PkgName }}</td>
|
||||||
|
<td>{{ escapeXML .VulnerabilityID }}</td>
|
||||||
|
<td class="severity">{{ escapeXML .Vulnerability.Severity }}</td>
|
||||||
|
<td class="pkg-version">{{ escapeXML .InstalledVersion }}</td>
|
||||||
|
<td>{{ escapeXML .FixedVersion }}</td>
|
||||||
|
<td class="links" data-more-links="off">
|
||||||
|
{{- range .Vulnerability.References }}
|
||||||
|
<a href={{ escapeXML . | printf "%q" }}>{{ escapeXML . }}</a>
|
||||||
|
{{- end }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if (eq (len .Misconfigurations ) 0) }}
|
||||||
|
<tr><th colspan="6">No Misconfigurations found</th></tr>
|
||||||
|
{{- else }}
|
||||||
|
<tr class="sub-header">
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Misconf ID</th>
|
||||||
|
<th>Check</th>
|
||||||
|
<th>Severity</th>
|
||||||
|
<th>Message</th>
|
||||||
|
</tr>
|
||||||
|
{{- range .Misconfigurations }}
|
||||||
|
<tr class="severity-{{ escapeXML .Severity }}">
|
||||||
|
<td class="misconf-type">{{ escapeXML .Type }}</td>
|
||||||
|
<td>{{ escapeXML .ID }}</td>
|
||||||
|
<td class="misconf-check">{{ escapeXML .Title }}</td>
|
||||||
|
<td class="severity">{{ escapeXML .Severity }}</td>
|
||||||
|
<td class="link" data-more-links="off" style="white-space:normal;"">
|
||||||
|
{{ escapeXML .Message }}
|
||||||
|
<br>
|
||||||
|
<a href={{ escapeXML .PrimaryURL | printf "%q" }}>{{ escapeXML .PrimaryURL }}</a>
|
||||||
|
</br>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
</table>
|
||||||
|
{{- else }}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Trivy Returned Empty Report</h1>
|
||||||
|
{{- end }}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -72,6 +72,7 @@ get_binaries() {
|
|||||||
freebsd/armv7) BINARIES="trivy" ;;
|
freebsd/armv7) BINARIES="trivy" ;;
|
||||||
linux/386) BINARIES="trivy" ;;
|
linux/386) BINARIES="trivy" ;;
|
||||||
linux/amd64) BINARIES="trivy" ;;
|
linux/amd64) BINARIES="trivy" ;;
|
||||||
|
linux/ppc64le) BINARIES="trivy" ;;
|
||||||
linux/arm64) BINARIES="trivy" ;;
|
linux/arm64) BINARIES="trivy" ;;
|
||||||
linux/armv7) BINARIES="trivy" ;;
|
linux/armv7) BINARIES="trivy" ;;
|
||||||
openbsd/386) BINARIES="trivy" ;;
|
openbsd/386) BINARIES="trivy" ;;
|
||||||
@@ -110,6 +111,7 @@ adjust_os() {
|
|||||||
amd64) OS=64bit ;;
|
amd64) OS=64bit ;;
|
||||||
arm) OS=ARM ;;
|
arm) OS=ARM ;;
|
||||||
arm64) OS=ARM64 ;;
|
arm64) OS=ARM64 ;;
|
||||||
|
ppc64le) OS=PPC64LE ;;
|
||||||
darwin) OS=macOS ;;
|
darwin) OS=macOS ;;
|
||||||
dragonfly) OS=DragonFlyBSD ;;
|
dragonfly) OS=DragonFlyBSD ;;
|
||||||
freebsd) OS=FreeBSD ;;
|
freebsd) OS=FreeBSD ;;
|
||||||
@@ -126,6 +128,7 @@ adjust_arch() {
|
|||||||
amd64) ARCH=64bit ;;
|
amd64) ARCH=64bit ;;
|
||||||
arm) ARCH=ARM ;;
|
arm) ARCH=ARM ;;
|
||||||
arm64) ARCH=ARM64 ;;
|
arm64) ARCH=ARM64 ;;
|
||||||
|
ppc64le) OS=PPC64LE ;;
|
||||||
darwin) ARCH=macOS ;;
|
darwin) ARCH=macOS ;;
|
||||||
dragonfly) ARCH=DragonFlyBSD ;;
|
dragonfly) ARCH=DragonFlyBSD ;;
|
||||||
freebsd) ARCH=FreeBSD ;;
|
freebsd) ARCH=FreeBSD ;;
|
||||||
@@ -179,11 +182,11 @@ log_tag() {
|
|||||||
}
|
}
|
||||||
log_debug() {
|
log_debug() {
|
||||||
log_priority 7 || return 0
|
log_priority 7 || return 0
|
||||||
echoerr "$(log_prefix)" "$(log_tag 7)" "$@"
|
echo "$(log_prefix)" "$(log_tag 7)" "$@"
|
||||||
}
|
}
|
||||||
log_info() {
|
log_info() {
|
||||||
log_priority 6 || return 0
|
log_priority 6 || return 0
|
||||||
echoerr "$(log_prefix)" "$(log_tag 6)" "$@"
|
echo "$(log_prefix)" "$(log_tag 6)" "$@"
|
||||||
}
|
}
|
||||||
log_err() {
|
log_err() {
|
||||||
log_priority 3 || return 0
|
log_priority 3 || return 0
|
||||||
@@ -209,6 +212,7 @@ uname_arch() {
|
|||||||
x86) arch="386" ;;
|
x86) arch="386" ;;
|
||||||
i686) arch="386" ;;
|
i686) arch="386" ;;
|
||||||
i386) arch="386" ;;
|
i386) arch="386" ;;
|
||||||
|
ppc64le) arch="ppc64le" ;;
|
||||||
aarch64) arch="arm64" ;;
|
aarch64) arch="arm64" ;;
|
||||||
armv5*) arch="armv5" ;;
|
armv5*) arch="armv5" ;;
|
||||||
armv6*) arch="armv6" ;;
|
armv6*) arch="armv6" ;;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<testsuites>
|
<testsuites>
|
||||||
{{- range . -}}
|
{{- range . -}}
|
||||||
{{- $failures := len .Vulnerabilities }}
|
{{- $failures := len .Vulnerabilities }}
|
||||||
<testsuite tests="1" failures="{{ $failures }}" time="" name="{{ .Target }}">
|
<testsuite tests="{{ $failures }}" failures="{{ $failures }}" name="{{ .Target }}" errors="0" skipped="0" time="">
|
||||||
{{- if not (eq .Type "") }}
|
{{- if not (eq .Type "") }}
|
||||||
<properties>
|
<properties>
|
||||||
<property name="type" value="{{ .Type }}"></property>
|
<property name="type" value="{{ .Type }}"></property>
|
||||||
@@ -10,7 +10,20 @@
|
|||||||
{{- end -}}
|
{{- end -}}
|
||||||
{{ range .Vulnerabilities }}
|
{{ range .Vulnerabilities }}
|
||||||
<testcase classname="{{ .PkgName }}-{{ .InstalledVersion }}" name="[{{ .Vulnerability.Severity }}] {{ .VulnerabilityID }}" time="">
|
<testcase classname="{{ .PkgName }}-{{ .InstalledVersion }}" name="[{{ .Vulnerability.Severity }}] {{ .VulnerabilityID }}" time="">
|
||||||
<failure message={{escapeXML .Title | printf "%q" }} type="description">{{escapeXML .Description | printf "%q" }}</failure>
|
<failure message="{{ escapeXML .Title }}" type="description">{{ escapeXML .Description }}</failure>
|
||||||
|
</testcase>
|
||||||
|
{{- end }}
|
||||||
|
</testsuite>
|
||||||
|
{{- $failures := len .Misconfigurations }}
|
||||||
|
<testsuite tests="{{ $failures }}" failures="{{ $failures }}" name="{{ .Target }}" errors="0" skipped="0" time="">
|
||||||
|
{{- if not (eq .Type "") }}
|
||||||
|
<properties>
|
||||||
|
<property name="type" value="{{ .Type }}"></property>
|
||||||
|
</properties>
|
||||||
|
{{- end -}}
|
||||||
|
{{ range .Misconfigurations }}
|
||||||
|
<testcase classname="{{ .Type }}" name="[{{ .Severity }}] {{ .ID }}" time="">
|
||||||
|
<failure message="{{ escapeXML .Title }}" type="description">{{ escapeXML .Description }}</failure>
|
||||||
</testcase>
|
</testcase>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0-rtm.4.json",
|
|
||||||
"version": "2.1.0",
|
|
||||||
"runs": [
|
|
||||||
{
|
|
||||||
"tool": {
|
|
||||||
"driver": {
|
|
||||||
"name": "Trivy",
|
|
||||||
"fullName": "Trivy Vulnerability Scanner",
|
|
||||||
"rules": [
|
|
||||||
{{- $t_first := true }}
|
|
||||||
{{- range . }}
|
|
||||||
{{- range .Vulnerabilities -}}
|
|
||||||
{{- if $t_first -}}
|
|
||||||
{{- $t_first = false -}}
|
|
||||||
{{ else -}}
|
|
||||||
,
|
|
||||||
{{- end }}
|
|
||||||
{
|
|
||||||
"id": "[{{ .Vulnerability.Severity }}] {{ .VulnerabilityID }}",
|
|
||||||
"name": "dockerfile_scan",
|
|
||||||
"shortDescription": {
|
|
||||||
"text": {{ printf "%v Package: %v" .VulnerabilityID .PkgName | printf "%q" }}
|
|
||||||
},
|
|
||||||
"fullDescription": {
|
|
||||||
"text": {{ endWithPeriod (escapeString .Title) | printf "%q" }}
|
|
||||||
},
|
|
||||||
"help": {
|
|
||||||
"text": {{ printf "Vulnerability %v\nSeverity: %v\nPackage: %v\nInstalled Version: %v\nFixed Version: %v\nLink: [%v](https://nvd.nist.gov/vuln/detail/%v)" .VulnerabilityID .Vulnerability.Severity .PkgName .InstalledVersion .FixedVersion .VulnerabilityID (.VulnerabilityID | toLower) | printf "%q"}},
|
|
||||||
"markdown": {{ printf "**Vulnerability %v**\n| Severity | Package | Installed Version | Fixed Version | Link |\n| --- | --- | --- | --- | --- |\n|%v|%v|%v|%v|[%v](https://nvd.nist.gov/vuln/detail/%v)|\n" .VulnerabilityID .Vulnerability.Severity .PkgName .InstalledVersion .FixedVersion .VulnerabilityID (.VulnerabilityID | toLower) | printf "%q"}}
|
|
||||||
},
|
|
||||||
"properties": {
|
|
||||||
"tags": [
|
|
||||||
"vulnerability",
|
|
||||||
"{{ .Vulnerability.Severity }}",
|
|
||||||
{{ .PkgName | printf "%q" }}
|
|
||||||
],
|
|
||||||
"precision": "very-high"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"results": [
|
|
||||||
{{- $t_first := true }}
|
|
||||||
{{- range . }}
|
|
||||||
{{- range $index, $vulnerability := .Vulnerabilities -}}
|
|
||||||
{{- if $t_first -}}
|
|
||||||
{{- $t_first = false -}}
|
|
||||||
{{ else -}}
|
|
||||||
,
|
|
||||||
{{- end }}
|
|
||||||
{
|
|
||||||
"ruleId": "[{{ $vulnerability.Vulnerability.Severity }}] {{ $vulnerability.VulnerabilityID }}",
|
|
||||||
"ruleIndex": {{ $index }},
|
|
||||||
"level": "error",
|
|
||||||
"message": {
|
|
||||||
"text": {{ endWithPeriod (escapeString $vulnerability.Description) | printf "%q" }}
|
|
||||||
},
|
|
||||||
"locations": [{
|
|
||||||
"physicalLocation": {
|
|
||||||
"artifactLocation": {
|
|
||||||
"uri": "Dockerfile"
|
|
||||||
},
|
|
||||||
"region": {
|
|
||||||
"startLine": 1,
|
|
||||||
"startColumn": 1,
|
|
||||||
"endColumn": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
{{- end -}}
|
|
||||||
{{- end -}}
|
|
||||||
],
|
|
||||||
"columnKind": "utf16CodeUnits"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
# Air-gapped environment
|
|
||||||
Trivy can be used in air-gapped environments.
|
|
||||||
|
|
||||||
## Download the vulnerability database
|
|
||||||
At first, you need to download the vulnerability database for use in air-gapped environments.
|
|
||||||
Go to [trivy-db](https://github.com/aquasecurity/trivy-db/releases) and download `trivy-offline.db.tgz` in the latest release.
|
|
||||||
If you download `trivy-light-offline.db.tgz`, you have to run Trivy with `--light` option.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ wget https://github.com/aquasecurity/trivy-db/releases/latest/download/trivy-offline.db.tgz
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Transfer the DB file into the air-gapped environment
|
|
||||||
The way of transfer depends on the environment.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ rsync -av -e ssh /path/to/trivy-offline.db.tgz [user]@[host]:dst
|
|
||||||
```
|
|
||||||
|
|
||||||
## Put the DB file in Trivy's cache directory
|
|
||||||
You have to know where to put the DB file. The following command shows the default cache directory.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ ssh user@host
|
|
||||||
$ trivy -h | grep cache
|
|
||||||
--cache-dir value cache directory (default: "/home/myuser/.cache/trivy") [$TRIVY_CACHE_DIR]
|
|
||||||
```
|
|
||||||
|
|
||||||
Put the DB file in the cache directory + `/db`.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ mkdir -p /home/myuser/.cache/trivy/db
|
|
||||||
$ cd /home/myuser/.cache/trivy/db
|
|
||||||
$ mv /path/to/trivy-offline.db.tgz .
|
|
||||||
```
|
|
||||||
|
|
||||||
Then, decompress it.
|
|
||||||
`trivy-offline.db.tgz` file includes two files, `trivy.db` and `metadata.json`.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ tar xvf trivy-offline.db.tgz
|
|
||||||
x trivy.db
|
|
||||||
x metadata.json
|
|
||||||
$ rm trivy-offline.db.tgz
|
|
||||||
```
|
|
||||||
|
|
||||||
In an air-gapped environment it is your responsibility to update the Trivy database on a regular basis, so that the scanner can detect recently-identified vulnerabilities.
|
|
||||||
|
|
||||||
## Run Trivy with --skip-update option
|
|
||||||
In an air-gapped environment, specify `--skip-update` so that Trivy doesn't attempt to download the latest database file.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ trivy image --skip-update alpine:3.12
|
|
||||||
```
|
|
||||||
10
docs/build/Dockerfile
vendored
Normal file
10
docs/build/Dockerfile
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
FROM squidfunk/mkdocs-material:8.2.10
|
||||||
|
|
||||||
|
## If you want to see exactly the same version as is published to GitHub pages
|
||||||
|
## use a private image for insiders, which requires authentication.
|
||||||
|
|
||||||
|
# docker login -u ${GITHUB_USERNAME} -p ${GITHUB_TOKEN} ghcr.io
|
||||||
|
# FROM ghcr.io/squidfunk/mkdocs-material-insiders
|
||||||
|
|
||||||
|
COPY requirements.txt .
|
||||||
|
RUN pip install -r requirements.txt
|
||||||
30
docs/build/requirements.txt
vendored
Normal file
30
docs/build/requirements.txt
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
click==8.1.2
|
||||||
|
csscompressor==0.9.5
|
||||||
|
ghp-import==2.0.2
|
||||||
|
htmlmin==0.1.12
|
||||||
|
importlib-metadata==4.11.3
|
||||||
|
Jinja2==3.1.1
|
||||||
|
jsmin==3.0.1
|
||||||
|
Markdown==3.3.6
|
||||||
|
MarkupSafe==2.1.1
|
||||||
|
mergedeep==1.3.4
|
||||||
|
mike==1.1.2
|
||||||
|
mkdocs==1.3.0
|
||||||
|
mkdocs-macros-plugin==0.7.0
|
||||||
|
mkdocs-material==8.2.10
|
||||||
|
mkdocs-material-extensions==1.0.3
|
||||||
|
mkdocs-minify-plugin==0.5.0
|
||||||
|
mkdocs-redirects==1.0.4
|
||||||
|
packaging==21.3
|
||||||
|
Pygments==2.11.2
|
||||||
|
pymdown-extensions==9.3
|
||||||
|
pyparsing==3.0.8
|
||||||
|
python-dateutil==2.8.2
|
||||||
|
PyYAML==6.0
|
||||||
|
pyyaml-env-tag==0.1
|
||||||
|
six==1.16.0
|
||||||
|
termcolor==1.1.0
|
||||||
|
verspec==0.1.0
|
||||||
|
watchdog==2.1.7
|
||||||
|
zipp==3.8.0
|
||||||
|
|
||||||
21
docs/community/cks.md
Normal file
21
docs/community/cks.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# CKS preparation resources
|
||||||
|
|
||||||
|
Community Resources
|
||||||
|
|
||||||
|
- [Trivy Video overview (short)][overview]
|
||||||
|
- [Example questions from the exam][exam]
|
||||||
|
- [More example questions][questions]
|
||||||
|
|
||||||
|
Aqua Security Blog posts
|
||||||
|
|
||||||
|
- Supply chain security best [practices][supply-chain-best-practices]
|
||||||
|
- Supply chain [attacks][supply-chain-attacks]
|
||||||
|
-
|
||||||
|
If you know of interesting resources, please start a PR to add those to the list.
|
||||||
|
|
||||||
|
[overview]: https://youtu.be/2cjH6Zkieys
|
||||||
|
[exam]: https://jonathan18186.medium.com/certified-kubernetes-security-specialist-cks-preparation-part-7-supply-chain-security-9cf62c34cf6a
|
||||||
|
[questions]: https://github.com/kodekloudhub/certified-kubernetes-security-specialist-cks-course/blob/main/docs/06-Supply-Chain-Security/09-Scan-images-for-known-vulnerabilities-(Trivy).md
|
||||||
|
|
||||||
|
[supply-chain-best-practices]: https://blog.aquasec.com/supply-chain-security-best-practices
|
||||||
|
[supply-chain-attacks]: https://blog.aquasec.com/supply-chain-threats-using-container-images
|
||||||
31
docs/community/contribute/issue.md
Normal file
31
docs/community/contribute/issue.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
Thank you for taking interest in contributing to Trivy!
|
||||||
|
|
||||||
|
- Feel free to open issues for any reason. When you open a new issue, you'll have to select an issue kind: bug/feature/support and fill the required information based on the selected template.
|
||||||
|
- Please spend a small amount of time giving due diligence to the issue tracker. Your issue might be a duplicate. If it is, please add your comment to the existing issue.
|
||||||
|
- Remember that users might search for your issue in the future, so please give it a meaningful title to help others.
|
||||||
|
- The issue should clearly explain the reason for opening, the proposal if you have any, and any relevant technical information.
|
||||||
|
|
||||||
|
## Wrong detection
|
||||||
|
Trivy depends on [multiple data sources](https://aquasecurity.github.io/trivy/latest/docs/vulnerability/detection/data-source/).
|
||||||
|
Sometime these databases contain mistakes.
|
||||||
|
|
||||||
|
If Trivy can't detect any CVE-IDs or shows false positive result, at first please follow the next steps:
|
||||||
|
|
||||||
|
1. Run Trivy with `-f json` that shows data sources.
|
||||||
|
2. According to the shown data source, make sure that the security advisory in the data source is correct.
|
||||||
|
|
||||||
|
If the data source is correct and Trivy shows wrong results, please raise an issue on Trivy.
|
||||||
|
|
||||||
|
### GitHub Advisory Database
|
||||||
|
Visit [here](https://github.com/advisories) and search CVE-ID.
|
||||||
|
|
||||||
|
If you find a problem, it'll be nice to fix it: [How to contribute to a GitHub security advisory](https://github.blog/2022-02-22-github-advisory-database-now-open-to-community-contributions/)
|
||||||
|
|
||||||
|
### GitLab Advisory Database
|
||||||
|
Visit [here](https://advisories.gitlab.com/) and search CVE-ID.
|
||||||
|
|
||||||
|
If you find a problem, it'll be nice to fix it: [Create an issue to GitLab Advisory Database](https://gitlab.com/gitlab-org/security-products/gemnasium-db/-/issues/new)
|
||||||
|
|
||||||
|
### Red Hat CVE Database
|
||||||
|
Visit [here](https://access.redhat.com/security/security-updates/?cwe=476#/cve) and search CVE-ID.
|
||||||
|
|
||||||
163
docs/community/contribute/pr.md
Normal file
163
docs/community/contribute/pr.md
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
Thank you for taking interest in contributing to Trivy!
|
||||||
|
|
||||||
|
1. Every Pull Request should have an associated bug or feature issue unless you are fixing a trivial documentation issue.
|
||||||
|
1. Please add the associated Issue link in the PR description.
|
||||||
|
1. Your PR is more likely to be accepted if it focuses on just one change.
|
||||||
|
1. There's no need to add or tag reviewers.
|
||||||
|
1. If a reviewer commented on your code or asked for changes, please remember to respond with comment. Do not mark discussion as resolved. It's up to reviewer to mark it resolved (in case if suggested fix addresses problem properly). PRs with unresolved issues should not be merged (even if the comment is unclear or requires no action from your side).
|
||||||
|
1. Please include a comment with the results before and after your change.
|
||||||
|
1. Your PR is more likely to be accepted if it includes tests (We have not historically been very strict about tests, but we would like to improve this!).
|
||||||
|
1. If your PR affects the user experience in some way, please update the README.md and the CLI help accordingly.
|
||||||
|
|
||||||
|
### Title
|
||||||
|
It is not that strict, but we use the title conventions in this repository.
|
||||||
|
Each commit message doesn't have to follow the conventions as long as it is clear and descriptive since it will be squashed and merged.
|
||||||
|
|
||||||
|
#### Format of the title
|
||||||
|
|
||||||
|
```
|
||||||
|
<type>(<scope>): <subject>
|
||||||
|
```
|
||||||
|
|
||||||
|
The `type` and `scope` should always be lowercase as shown below.
|
||||||
|
|
||||||
|
**Allowed `<type>` values:**
|
||||||
|
|
||||||
|
- **feat** for a new feature for the user, not a new feature for build script. Such commit will trigger a release bumping a MINOR version.
|
||||||
|
- **fix** for a bug fix for the user, not a fix to a build script. Such commit will trigger a release bumping a PATCH version.
|
||||||
|
- **perf** for performance improvements. Such commit will trigger a release bumping a PATCH version.
|
||||||
|
- **docs** for changes to the documentation.
|
||||||
|
- **style** for formatting changes, missing semicolons, etc.
|
||||||
|
- **refactor** for refactoring production code, e.g. renaming a variable.
|
||||||
|
- **test** for adding missing tests, refactoring tests; no production code change.
|
||||||
|
- **build** for updating build configuration, development tools or other changes irrelevant to the user.
|
||||||
|
- **chore** for updates that do not apply to the above, such as dependency updates.
|
||||||
|
- **ci** for changes to CI configuration files and scripts
|
||||||
|
- **revert** for revert to a previous commit
|
||||||
|
|
||||||
|
**Allowed `<scope>` values:**
|
||||||
|
|
||||||
|
checks:
|
||||||
|
|
||||||
|
- vuln
|
||||||
|
- misconf
|
||||||
|
- secret
|
||||||
|
|
||||||
|
mode:
|
||||||
|
|
||||||
|
- image
|
||||||
|
- fs
|
||||||
|
- repo
|
||||||
|
- sbom
|
||||||
|
- server
|
||||||
|
|
||||||
|
os:
|
||||||
|
|
||||||
|
- alpine
|
||||||
|
- redhat
|
||||||
|
- alma
|
||||||
|
- rocky
|
||||||
|
- mariner
|
||||||
|
- oracle
|
||||||
|
- debian
|
||||||
|
- ubuntu
|
||||||
|
- amazon
|
||||||
|
- suse
|
||||||
|
- photon
|
||||||
|
- distroless
|
||||||
|
|
||||||
|
language:
|
||||||
|
|
||||||
|
- ruby
|
||||||
|
- php
|
||||||
|
- python
|
||||||
|
- nodejs
|
||||||
|
- rust
|
||||||
|
- dotnet
|
||||||
|
- java
|
||||||
|
- go
|
||||||
|
|
||||||
|
vuln:
|
||||||
|
|
||||||
|
- os
|
||||||
|
- lang
|
||||||
|
|
||||||
|
config:
|
||||||
|
|
||||||
|
- kubernetes
|
||||||
|
- dockerfile
|
||||||
|
- terraform
|
||||||
|
- cloudformation
|
||||||
|
|
||||||
|
container
|
||||||
|
|
||||||
|
- docker
|
||||||
|
- podman
|
||||||
|
- containerd
|
||||||
|
- oci
|
||||||
|
|
||||||
|
cli:
|
||||||
|
|
||||||
|
- cli
|
||||||
|
- flag
|
||||||
|
|
||||||
|
others:
|
||||||
|
|
||||||
|
- helm
|
||||||
|
- report
|
||||||
|
- db
|
||||||
|
- deps
|
||||||
|
|
||||||
|
The `<scope>` can be empty (e.g. if the change is a global or difficult to assign to a single component), in which case the parentheses are omitted.
|
||||||
|
|
||||||
|
#### Example titles
|
||||||
|
|
||||||
|
```
|
||||||
|
feat(alma): add support for AlmaLinux
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
fix(oracle): handle advisories with ksplice versions
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
docs(misconf): add comparison with Conftest and TFsec
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
chore(deps): bump go.uber.org/zap from 1.19.1 to 1.20.0
|
||||||
|
```
|
||||||
|
|
||||||
|
**NOTE**: please do not use `chore(deps): update fanal` and something like that if you add new features or fix bugs in Trivy-related projects.
|
||||||
|
The PR title should describe what the PR adds or fixes even though it just updates the dependency in Trivy.
|
||||||
|
|
||||||
|
### Unit tests
|
||||||
|
Your PR must pass all the unit tests. You can test it as below.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ make test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration tests
|
||||||
|
Your PR must pass all the integration tests. You can test it as below.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ make test-integration
|
||||||
|
```
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
You can build the documents as below and view it at http://localhost:8000.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ make mkdocs-serve
|
||||||
|
```
|
||||||
|
|
||||||
|
## Understand where your pull request belongs
|
||||||
|
|
||||||
|
Trivy is composed of several repositories that work together:
|
||||||
|
|
||||||
|
- [Trivy](https://github.com/aquasecurity/trivy) is the client-side, user-facing, command line tool.
|
||||||
|
- [vuln-list](https://github.com/aquasecurity/vuln-list) is a vulnerabilities database, aggregated from different sources, and normalized for easy consumption. Think of this as the "server" side of the trivy command line tool. **There should be no pull requests to this repo**
|
||||||
|
- [vuln-list-update](https://github.com/aquasecurity/vuln-list-update) is the code that maintains the vuln-list database.
|
||||||
|
- [trivy-db](https://github.com/aquasecurity/trivy-db) maintains the vulnerability database pulled by Trivy CLI.
|
||||||
|
- [go-dep-parser](https://github.com/aquasecurity/go-dep-parser) is a library for parsing lock files such as package-lock.json and Gemfile.lock.
|
||||||
10
docs/community/credit.md
Normal file
10
docs/community/credit.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Author
|
||||||
|
|
||||||
|
[Teppei Fukuda][knqyf263] (knqyf263)
|
||||||
|
|
||||||
|
# Contributors
|
||||||
|
|
||||||
|
Thanks to all [contributors][contributors]
|
||||||
|
|
||||||
|
[knqyf263]: https://github.com/knqyf263
|
||||||
|
[contributors]: https://github.com/aquasecurity/trivy/graphs/contributors
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
|
# Triage
|
||||||
|
|
||||||
Triage is an important part of maintaining the health of the trivy repo.
|
Triage is an important part of maintaining the health of the trivy repo.
|
||||||
A well organized repo allows maintainers to prioritize feature requests, fix bugs, and respond to users facing difficulty with the tool as quickly as possible.
|
A well organized repo allows maintainers to prioritize feature requests, fix bugs, and respond to users facing difficulty with the tool as quickly as possible.
|
||||||
|
|
||||||
Triage includes:
|
Triage includes:
|
||||||
|
|
||||||
- Labeling issues
|
- Labeling issues
|
||||||
- Responding to issues
|
- Responding to issues
|
||||||
- Closing issues
|
- Closing issues
|
||||||
@@ -185,11 +188,11 @@ We use two labels [help wanted](https://github.com/aquasecurity/trivy/issues?q=i
|
|||||||
and [good first issue](https://github.com/aquasecurity/trivy/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)
|
and [good first issue](https://github.com/aquasecurity/trivy/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)
|
||||||
to identify issues that have been specially groomed for new contributors.
|
to identify issues that have been specially groomed for new contributors.
|
||||||
|
|
||||||
We have specific [guidelines](/docs/help-wanted.md)
|
We have specific [guidelines](/docs/community/maintainer/help-wanted.md)
|
||||||
for how to use these labels. If you see an issue that satisfies these
|
for how to use these labels. If you see an issue that satisfies these
|
||||||
guidelines, you can add the `help wanted` label and the `good first issue` label.
|
guidelines, you can add the `help wanted` label and the `good first issue` label.
|
||||||
Please note that adding the `good first issue` label must also
|
Please note that adding the `good first issue` label must also
|
||||||
add the `help wanted` label.
|
add the `help wanted` label.
|
||||||
|
|
||||||
If an issue has these labels but does not satisfy the guidelines, please
|
If an issue has these labels but does not satisfy the guidelines, please
|
||||||
ask for more details to be added to the issue or remove the labels.
|
ask for more details to be added to the issue or remove the labels.
|
||||||
48
docs/community/references.md
Normal file
48
docs/community/references.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# Additional References
|
||||||
|
There are external blogs and evaluations.
|
||||||
|
|
||||||
|
## Blogs
|
||||||
|
- [Trivy Vulnerability Scanner Joins the Aqua Open-source Family][join]
|
||||||
|
- [Trivy Image Vulnerability Scanner Now Under Apache 2.0 License][license]
|
||||||
|
- [DevSecOps with Trivy and GitHub Actions][actions]
|
||||||
|
- [Find Image Vulnerabilities Using GitHub and Aqua Security Trivy Action][actions2]
|
||||||
|
- [Using Trivy to Discover Vulnerabilities in VS Code Projects][vscode]
|
||||||
|
- [the vulnerability remediation lifecycle of Alpine containers][alpine]
|
||||||
|
- [Continuous Container Vulnerability Testing with Trivy][semaphore]
|
||||||
|
- [Open Source CVE Scanner Round-Up: Clair vs Anchore vs Trivy][round-up]
|
||||||
|
- [Docker Image Security: Static Analysis Tool Comparison – Anchore Engine vs Clair vs Trivy][tool-comparison]
|
||||||
|
|
||||||
|
## Links
|
||||||
|
- [Research Spike: evaluate Trivy for scanning running containers][gitlab]
|
||||||
|
- [Istio evaluates scanners][istio]
|
||||||
|
|
||||||
|
## Presentations
|
||||||
|
- Aqua Security YouTube Channel
|
||||||
|
- [Trivy - container image scanning][intro]
|
||||||
|
- [Using Trivy in client server mode][server]
|
||||||
|
- [Tweaking Trivy output to fit your workflow][tweaking]
|
||||||
|
- [How does a vulnerability scanner identify packages?][identify]
|
||||||
|
- CNCF Webinar 2020
|
||||||
|
- [Trivy Open Source Scanner for Container Images – Just Download and Run!][cncf]
|
||||||
|
- KubeCon + CloudNativeCon Europe 2020 Virtual
|
||||||
|
- [Handling Container Vulnerabilities with Open Policy Agent - Teppei Fukuda, Aqua Security][kubecon]
|
||||||
|
|
||||||
|
[alpine]: https://ariadne.space/2021/06/08/the-vulnerability-remediation-lifecycle-of-alpine-containers/
|
||||||
|
[semaphore]: https://semaphoreci.com/blog/continuous-container-vulnerability-testing-with-trivy
|
||||||
|
[round-up]: https://boxboat.com/2020/04/24/image-scanning-tech-compared/
|
||||||
|
[tool-comparison]: https://www.a10o.net/devsecops/docker-image-security-static-analysis-tool-comparison-anchore-engine-vs-clair-vs-trivy/
|
||||||
|
[gitlab]: https://gitlab.com/gitlab-org/gitlab/-/issues/270888
|
||||||
|
[istio]: https://github.com/istio/release-builder/pull/687#issuecomment-874938417
|
||||||
|
|
||||||
|
[intro]: https://www.youtube.com/watch?v=AzOBGm7XxOA
|
||||||
|
[cncf]: https://www.youtube.com/watch?v=XnYxX9uueoQ
|
||||||
|
[server]: https://www.youtube.com/watch?v=tNQ-VlahtYM
|
||||||
|
[kubecon]: https://www.youtube.com/watch?v=WKE2XNZ2zr4
|
||||||
|
[identify]: https://www.youtube.com/watch?v=PaMnzeHBa8M
|
||||||
|
[tweaking]: https://www.youtube.com/watch?v=wFIGUjcRLnU
|
||||||
|
|
||||||
|
[join]: https://blog.aquasec.com/trivy-vulnerability-scanner-joins-aqua-family
|
||||||
|
[license]: https://blog.aquasec.com/trivy-open-source-vulnerability-scanner-apache2.0-license
|
||||||
|
[actions]: https://blog.aquasec.com/devsecops-with-trivy-github-actions
|
||||||
|
[actions2]: https://blog.aquasec.com/github-vulnerability-scanner-trivy
|
||||||
|
[vscode]: https://blog.aquasec.com/trivy-open-source-vulnerability-scanner-vs-code
|
||||||
37
docs/community/tools.md
Normal file
37
docs/community/tools.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Community Tools
|
||||||
|
The open source community has been hard at work developing new tools for Trivy. You can check out some of them here.
|
||||||
|
|
||||||
|
Have you created a tool that’s not listed? Add the name and description of your integration and open a pull request in the GitHub repository to get your change merged.
|
||||||
|
|
||||||
|
## GitHub Actions
|
||||||
|
|
||||||
|
| Actions | Description |
|
||||||
|
| ------------------------------------------ | -------------------------------------------------------------------------------- |
|
||||||
|
| [gitrivy][gitrivy] | GitHub Issue + Trivy |
|
||||||
|
| [trivy-github-issues][trivy-github-issues] | GitHub Actions for creating GitHub Issues according to the Trivy scanning result |
|
||||||
|
|
||||||
|
## Semaphore
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| -------------------------------------------------------| ----------------------------------------- |
|
||||||
|
| [Continuous Vulnerability Testing with Trivy][semaphore-tutorial] | Tutorial on scanning code, containers, infrastructure, and Kubernetes with Semaphore CI/CD. |
|
||||||
|
|
||||||
|
|
||||||
|
## CircleCI
|
||||||
|
|
||||||
|
| Orb | Description |
|
||||||
|
| -----------------------------------------| ----------------------------------------- |
|
||||||
|
| [fifteen5/trivy-orb][fifteen5/trivy-orb] | Orb for running Trivy, a security scanner |
|
||||||
|
|
||||||
|
## Others
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
| -----------------------------------------| ----------------------------------------- |
|
||||||
|
| [Trivy Vulnerability Explorer][explorer] | Explore trivy vulnerability reports in your browser and create .trivyignore files interactively. Can be integrated in your CI/CD tooling with deep links. |
|
||||||
|
|
||||||
|
|
||||||
|
[trivy-github-issues]: https://github.com/marketplace/actions/trivy-github-issues
|
||||||
|
[fifteen5/trivy-orb]: https://circleci.com/developer/orbs/orb/fifteen5/trivy-orb
|
||||||
|
[gitrivy]: https://github.com/marketplace/actions/trivy-action
|
||||||
|
[explorer]: https://dbsystel.github.io/trivy-vulnerability-explorer/
|
||||||
|
[semaphore-tutorial]: https://semaphoreci.com/blog/continuous-container-vulnerability-testing-with-trivy
|
||||||
66
docs/docs/advanced/air-gap.md
Normal file
66
docs/docs/advanced/air-gap.md
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# Air-Gapped Environment
|
||||||
|
|
||||||
|
Trivy can be used in air-gapped environments. Note that an allowlist is [here][allowlist].
|
||||||
|
|
||||||
|
## Air-Gapped Environment for vulnerabilities
|
||||||
|
|
||||||
|
### Download the vulnerability database
|
||||||
|
At first, you need to download the vulnerability database for use in air-gapped environments.
|
||||||
|
Please follow [oras installation instruction][oras].
|
||||||
|
|
||||||
|
Download `db.tar.gz`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ oras pull ghcr.io/aquasecurity/trivy-db:2 -a
|
||||||
|
```
|
||||||
|
|
||||||
|
### Transfer the DB file into the air-gapped environment
|
||||||
|
The way of transfer depends on the environment.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rsync -av -e ssh /path/to/db.tar.gz [user]@[host]:dst
|
||||||
|
```
|
||||||
|
|
||||||
|
### Put the DB file in Trivy's cache directory
|
||||||
|
You have to know where to put the DB file. The following command shows the default cache directory.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh user@host
|
||||||
|
$ trivy -h | grep cache
|
||||||
|
--cache-dir value cache directory (default: "/home/myuser/.cache/trivy") [$TRIVY_CACHE_DIR]
|
||||||
|
```
|
||||||
|
|
||||||
|
Put the DB file in the cache directory + `/db`.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ mkdir -p /home/myuser/.cache/trivy/db
|
||||||
|
$ cd /home/myuser/.cache/trivy/db
|
||||||
|
$ tar xvf /path/to/db.tar.gz -C /home/myuser/.cache/trivy/db
|
||||||
|
x trivy.db
|
||||||
|
x metadata.json
|
||||||
|
$ rm /path/to/db.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
In an air-gapped environment it is your responsibility to update the Trivy database on a regular basis, so that the scanner can detect recently-identified vulnerabilities.
|
||||||
|
|
||||||
|
### Run Trivy with --skip-update and --offline-scan option
|
||||||
|
In an air-gapped environment, specify `--skip-update` so that Trivy doesn't attempt to download the latest database file.
|
||||||
|
In addition, if you want to scan Java dependencies such as JAR and pom.xml, you need to specify `--offline-scan` since Trivy tries to issue API requests for scanning Java applications by default.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy image --skip-update --offline-scan alpine:3.12
|
||||||
|
```
|
||||||
|
|
||||||
|
## Air-Gapped Environment for misconfigurations
|
||||||
|
|
||||||
|
No special measures are required to detect misconfigurations in an air-gapped environment.
|
||||||
|
|
||||||
|
### Run Trivy with --skip-policy-update option
|
||||||
|
In an air-gapped environment, specify `--skip-policy-update` so that Trivy doesn't attempt to download the latest misconfiguration policies.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy conf --skip-policy-update /path/to/conf
|
||||||
|
```
|
||||||
|
|
||||||
|
[allowlist]: ../references/troubleshooting.md
|
||||||
|
[oras]: https://oras.land/cli/
|
||||||
22
docs/docs/advanced/container/containerd.md
Normal file
22
docs/docs/advanced/container/containerd.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# containerd
|
||||||
|
|
||||||
|
!!! warning "EXPERIMENTAL"
|
||||||
|
This feature might change without preserving backwards compatibility.
|
||||||
|
|
||||||
|
Scan your image in [containerd][containerd] running locally.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ nerdctl images
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE
|
||||||
|
aquasec/nginx latest 2bcabc23b454 3 hours ago linux/amd64 149.1 MiB 54.1 MiB
|
||||||
|
$ trivy image aquasec/nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
If your containerd socket is not the default path (`//run/containerd/containerd.sock`), you can override it via `CONTAINERD_ADDRESS`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ export CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock
|
||||||
|
$ trivy image aquasec/nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
[containerd]: https://containerd.io/
|
||||||
28
docs/docs/advanced/container/embed-in-dockerfile.md
Normal file
28
docs/docs/advanced/container/embed-in-dockerfile.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Embed in Dockerfile
|
||||||
|
|
||||||
|
Scan your image as part of the build process by embedding Trivy in the
|
||||||
|
Dockerfile. This approach can be used to update Dockerfiles currently using
|
||||||
|
Aqua’s [Microscanner][microscanner].
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cat Dockerfile
|
||||||
|
FROM alpine:3.7
|
||||||
|
|
||||||
|
RUN apk add curl \
|
||||||
|
&& curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin \
|
||||||
|
&& trivy rootfs --exit-code 1 --no-progress /
|
||||||
|
|
||||||
|
$ docker build -t vulnerable-image .
|
||||||
|
```
|
||||||
|
Alternatively you can use Trivy in a multistage build. Thus avoiding the
|
||||||
|
insecure `curl | sh`. Also the image is not changed.
|
||||||
|
```bash
|
||||||
|
[...]
|
||||||
|
# Run vulnerability scan on build image
|
||||||
|
FROM build AS vulnscan
|
||||||
|
COPY --from=aquasec/trivy:latest /usr/local/bin/trivy /usr/local/bin/trivy
|
||||||
|
RUN trivy rootfs --exit-code 1 --no-progress /
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
[microscanner]: https://github.com/aquasecurity/microscanner
|
||||||
17
docs/docs/advanced/container/oci.md
Normal file
17
docs/docs/advanced/container/oci.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# OCI Image Layout
|
||||||
|
|
||||||
|
An image directory compliant with [Open Container Image Layout Specification](https://github.com/opencontainers/image-spec/blob/master/spec.md).
|
||||||
|
|
||||||
|
Buildah:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ buildah push docker.io/library/alpine:3.11 oci:/path/to/alpine
|
||||||
|
$ trivy image --input /path/to/alpine
|
||||||
|
```
|
||||||
|
|
||||||
|
Skopeo:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ skopeo copy docker-daemon:alpine:3.11 oci:/path/to/alpine
|
||||||
|
$ trivy image --input /path/to/alpine
|
||||||
|
```
|
||||||
28
docs/docs/advanced/container/podman.md
Normal file
28
docs/docs/advanced/container/podman.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Podman
|
||||||
|
|
||||||
|
!!! warning "EXPERIMENTAL"
|
||||||
|
This feature might change without preserving backwards compatibility.
|
||||||
|
|
||||||
|
Scan your image in Podman (>=2.0) running locally. The remote Podman is not supported.
|
||||||
|
Before performing Trivy commands, you must enable the podman.sock systemd service on your machine.
|
||||||
|
For more details, see [here][sock].
|
||||||
|
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ systemctl --user enable --now podman.socket
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, you can scan your image in Podman.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cat Dockerfile
|
||||||
|
FROM alpine:3.12
|
||||||
|
RUN apk add --no-cache bash
|
||||||
|
$ podman build -t test .
|
||||||
|
$ podman images
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
|
localhost/test latest efc372d4e0de About a minute ago 7.94 MB
|
||||||
|
$ trivy image test
|
||||||
|
```
|
||||||
|
|
||||||
|
[sock]: https://github.com/containers/podman/blob/master/docs/tutorials/remote_client.md#enable-the-podman-service-on-the-server-machine
|
||||||
116
docs/docs/advanced/container/unpacked-filesystem.md
Normal file
116
docs/docs/advanced/container/unpacked-filesystem.md
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
# Unpacked Filesystem
|
||||||
|
|
||||||
|
Scan an unpacked container image filesystem.
|
||||||
|
|
||||||
|
In this case, Trivy works the same way when scanning containers
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ docker export $(docker create alpine:3.10.2) | tar -C /tmp/rootfs -xvf -
|
||||||
|
$ trivy rootfs /tmp/rootfs
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```bash
|
||||||
|
2021-03-08T05:22:26.378Z INFO Need to update DB
|
||||||
|
2021-03-08T05:22:26.380Z INFO Downloading DB...
|
||||||
|
20.37 MiB / 20.37 MiB [-------------------------------------------------------------------------------------------------------------------------------------] 100.00% 8.24 MiB p/s 2s
|
||||||
|
2021-03-08T05:22:30.134Z INFO Detecting Alpine vulnerabilities...
|
||||||
|
|
||||||
|
/tmp/rootfs (alpine 3.10.2)
|
||||||
|
===========================
|
||||||
|
Total: 20 (UNKNOWN: 0, LOW: 2, MEDIUM: 10, HIGH: 8, CRITICAL: 0)
|
||||||
|
|
||||||
|
+--------------+------------------+----------+-------------------+---------------+---------------------------------------+
|
||||||
|
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
|
||||||
|
+--------------+------------------+----------+-------------------+---------------+---------------------------------------+
|
||||||
|
| libcrypto1.1 | CVE-2020-1967 | HIGH | 1.1.1c-r0 | 1.1.1g-r0 | openssl: Segmentation |
|
||||||
|
| | | | | | fault in SSL_check_chain |
|
||||||
|
| | | | | | causes denial of service |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-1967 |
|
||||||
|
+ +------------------+ + +---------------+---------------------------------------+
|
||||||
|
| | CVE-2021-23839 | | | 1.1.1j-r0 | openssl: incorrect SSLv2 |
|
||||||
|
| | | | | | rollback protection |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23839 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2021-23840 | | | | openssl: integer |
|
||||||
|
| | | | | | overflow in CipherUpdate |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23840 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2021-23841 | | | | openssl: NULL pointer dereference |
|
||||||
|
| | | | | | in X509_issuer_and_serial_hash() |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23841 |
|
||||||
|
+ +------------------+----------+ +---------------+---------------------------------------+
|
||||||
|
| | CVE-2019-1547 | MEDIUM | | 1.1.1d-r0 | openssl: side-channel weak |
|
||||||
|
| | | | | | encryption vulnerability |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1547 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2019-1549 | | | | openssl: information |
|
||||||
|
| | | | | | disclosure in fork() |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1549 |
|
||||||
|
+ +------------------+ + +---------------+---------------------------------------+
|
||||||
|
| | CVE-2019-1551 | | | 1.1.1d-r2 | openssl: Integer overflow in RSAZ |
|
||||||
|
| | | | | | modular exponentiation on x86_64 |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1551 |
|
||||||
|
+ +------------------+ + +---------------+---------------------------------------+
|
||||||
|
| | CVE-2020-1971 | | | 1.1.1i-r0 | openssl: EDIPARTYNAME |
|
||||||
|
| | | | | | NULL pointer de-reference |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-1971 |
|
||||||
|
+ +------------------+----------+ +---------------+---------------------------------------+
|
||||||
|
| | CVE-2019-1563 | LOW | | 1.1.1d-r0 | openssl: information |
|
||||||
|
| | | | | | disclosure in PKCS7_dataDecode |
|
||||||
|
| | | | | | and CMS_decrypt_set1_pkey |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1563 |
|
||||||
|
+--------------+------------------+----------+ +---------------+---------------------------------------+
|
||||||
|
| libssl1.1 | CVE-2020-1967 | HIGH | | 1.1.1g-r0 | openssl: Segmentation |
|
||||||
|
| | | | | | fault in SSL_check_chain |
|
||||||
|
| | | | | | causes denial of service |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-1967 |
|
||||||
|
+ +------------------+ + +---------------+---------------------------------------+
|
||||||
|
| | CVE-2021-23839 | | | 1.1.1j-r0 | openssl: incorrect SSLv2 |
|
||||||
|
| | | | | | rollback protection |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23839 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2021-23840 | | | | openssl: integer |
|
||||||
|
| | | | | | overflow in CipherUpdate |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23840 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2021-23841 | | | | openssl: NULL pointer dereference |
|
||||||
|
| | | | | | in X509_issuer_and_serial_hash() |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2021-23841 |
|
||||||
|
+ +------------------+----------+ +---------------+---------------------------------------+
|
||||||
|
| | CVE-2019-1547 | MEDIUM | | 1.1.1d-r0 | openssl: side-channel weak |
|
||||||
|
| | | | | | encryption vulnerability |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1547 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2019-1549 | | | | openssl: information |
|
||||||
|
| | | | | | disclosure in fork() |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1549 |
|
||||||
|
+ +------------------+ + +---------------+---------------------------------------+
|
||||||
|
| | CVE-2019-1551 | | | 1.1.1d-r2 | openssl: Integer overflow in RSAZ |
|
||||||
|
| | | | | | modular exponentiation on x86_64 |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1551 |
|
||||||
|
+ +------------------+ + +---------------+---------------------------------------+
|
||||||
|
| | CVE-2020-1971 | | | 1.1.1i-r0 | openssl: EDIPARTYNAME |
|
||||||
|
| | | | | | NULL pointer de-reference |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-1971 |
|
||||||
|
+ +------------------+----------+ +---------------+---------------------------------------+
|
||||||
|
| | CVE-2019-1563 | LOW | | 1.1.1d-r0 | openssl: information |
|
||||||
|
| | | | | | disclosure in PKCS7_dataDecode |
|
||||||
|
| | | | | | and CMS_decrypt_set1_pkey |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-1563 |
|
||||||
|
+--------------+------------------+----------+-------------------+---------------+---------------------------------------+
|
||||||
|
| musl | CVE-2020-28928 | MEDIUM | 1.1.22-r3 | 1.1.22-r4 | In musl libc through 1.2.1, |
|
||||||
|
| | | | | | wcsnrtombs mishandles particular |
|
||||||
|
| | | | | | combinations of destination buffer... |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-28928 |
|
||||||
|
+--------------+ + + + + +
|
||||||
|
| musl-utils | | | | | |
|
||||||
|
| | | | | | |
|
||||||
|
| | | | | | |
|
||||||
|
| | | | | | |
|
||||||
|
+--------------+------------------+----------+-------------------+---------------+---------------------------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
358
docs/docs/advanced/modules.md
Normal file
358
docs/docs/advanced/modules.md
Normal file
@@ -0,0 +1,358 @@
|
|||||||
|
# Modules
|
||||||
|
|
||||||
|
!!! warning "EXPERIMENTAL"
|
||||||
|
This feature might change without preserving backwards compatibility.
|
||||||
|
|
||||||
|
Trivy provides a module feature to allow others to extend the Trivy CLI without the need to change the Trivy code base.
|
||||||
|
It changes the behavior during scanning by WebAssembly.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Trivy modules are add-on tools that integrate seamlessly with Trivy.
|
||||||
|
They provide a way to extend the core feature set of Trivy, but without updating the Trivy binary.
|
||||||
|
|
||||||
|
- They can be added and removed from a Trivy installation without impacting the core Trivy tool.
|
||||||
|
- They can be written in any programming language supporting WebAssembly.
|
||||||
|
- It supports only [TinyGo][tinygo] at the moment.
|
||||||
|
|
||||||
|
You can write your own detection logic.
|
||||||
|
|
||||||
|
- Evaluate complex vulnerability conditions like [Spring4Shell][spring4shell]
|
||||||
|
- Detect a shell script communicating with malicious domains
|
||||||
|
- Detect malicious python install script (setup.py)
|
||||||
|
- Even detect misconfigurations in WordPress setting
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
Then, you can update the scan result however you want.
|
||||||
|
|
||||||
|
- Change a severity
|
||||||
|
- Remove a vulnerability
|
||||||
|
- Add a new vulnerability
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
Modules should be distributed in OCI registries like GitHub Container Registry.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
WebAssembly doesn't allow file access and network access by default.
|
||||||
|
Modules can read required files only, but cannot overwrite them.
|
||||||
|
WebAssembly is sandboxed and secure by design, but Trivy modules available in public are not audited for security.
|
||||||
|
You should install and run third-party modules at your own risk even though
|
||||||
|
|
||||||
|
Under the hood Trivy leverages [wazero][wazero] to run WebAssembly modules without CGO.
|
||||||
|
|
||||||
|
## Installing a Module
|
||||||
|
A module can be installed using the `trivy module install` command.
|
||||||
|
This command takes an url. It will download the module and install it in the module cache.
|
||||||
|
|
||||||
|
Trivy adheres to the XDG specification, so the location depends on whether XDG_DATA_HOME is set.
|
||||||
|
Trivy will now search XDG_DATA_HOME for the location of the Trivy modules cache.
|
||||||
|
The preference order is as follows:
|
||||||
|
|
||||||
|
- XDG_DATA_HOME if set and .trivy/plugins exists within the XDG_DATA_HOME dir
|
||||||
|
- $HOME/.trivy/plugins
|
||||||
|
|
||||||
|
For example, to download the WebAssembly module, you can execute the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy module install ghcr.io/aquasecurity/trivy-module-spring4shell
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using Modules
|
||||||
|
Once the module is installed, Trivy will load all available modules in the cache on the start of the next Trivy execution.
|
||||||
|
The modules may inject custom logic into scanning and change the result.
|
||||||
|
You can run Trivy as usual and modules are loaded automatically.
|
||||||
|
|
||||||
|
You will see the log messages about WASM modules.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ trivy image ghcr.io/aquasecurity/trivy-test-images:spring4shell-jre8
|
||||||
|
2022-06-12T12:57:13.210+0300 INFO Loading ghcr.io/aquasecurity/trivy-module-spring4shell/spring4shell.wasm...
|
||||||
|
2022-06-12T12:57:13.596+0300 INFO Registering WASM module: spring4shell@v1
|
||||||
|
...
|
||||||
|
2022-06-12T12:57:14.865+0300 INFO Module spring4shell: Java Version: 8, Tomcat Version: 8.5.77
|
||||||
|
2022-06-12T12:57:14.865+0300 INFO Module spring4shell: change CVE-2022-22965 severity from CRITICAL to LOW
|
||||||
|
|
||||||
|
Java (jar)
|
||||||
|
|
||||||
|
Total: 9 (UNKNOWN: 1, LOW: 3, MEDIUM: 2, HIGH: 3, CRITICAL: 0)
|
||||||
|
|
||||||
|
┌──────────────────────────────────────────────────────────────┬─────────────────────┬──────────┬───────────────────┬────────────────────────┬────────────────────────────────────────────────────────────┐
|
||||||
|
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
|
||||||
|
├──────────────────────────────────────────────────────────────┼─────────────────────┼──────────┼───────────────────┼────────────────────────┼────────────────────────────────────────────────────────────┤
|
||||||
|
│ org.springframework.boot:spring-boot (helloworld.war) │ CVE-2022-22965 │ LOW │ 2.6.3 │ 2.5.12, 2.6.6 │ spring-framework: RCE via Data Binding on JDK 9+ │
|
||||||
|
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-22965 │
|
||||||
|
├──────────────────────────────────────────────────────────────┼─────────────────────┼──────────┼───────────────────┼────────────────────────┼────────────────────────────────────────────────────────────┤
|
||||||
|
...(snip)...
|
||||||
|
```
|
||||||
|
|
||||||
|
In the above example, the Spring4Shell module changed the severity from CRITICAL to LOW because the application doesn't satisfy one of conditions.
|
||||||
|
|
||||||
|
## Uninstalling Modules
|
||||||
|
Specify a module repository with `trivy module uninstall` command.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy module uninstall ghcr.io/aquasecurity/trivy-module-spring4shell
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building Modules
|
||||||
|
It supports TinyGo only at the moment.
|
||||||
|
|
||||||
|
### TinyGo
|
||||||
|
Trivy provides Go SDK including three interfaces.
|
||||||
|
Your own module needs to implement either or both `Analyzer` and `PostScanner` in addition to `Module`.
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Module interface {
|
||||||
|
Version() int
|
||||||
|
Name() string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Analyzer interface {
|
||||||
|
RequiredFiles() []string
|
||||||
|
Analyze(filePath string) (*serialize.AnalysisResult, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type PostScanner interface {
|
||||||
|
PostScanSpec() serialize.PostScanSpec
|
||||||
|
PostScan(serialize.Results) (serialize.Results, error)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In the following tutorial, it creates a WordPress module that detects a WordPress version and a critical vulnerability accordingly.
|
||||||
|
|
||||||
|
!!! tips
|
||||||
|
You can use logging functions such as `Debug` and `Info` for debugging.
|
||||||
|
See [examples](#examples) for the detail.
|
||||||
|
|
||||||
|
#### Initialize your module
|
||||||
|
Replace the repository name with yours.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ go mod init github.com/aquasecurity/trivy-module-wordpress
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Module interface
|
||||||
|
`Version()` returns your module version and should be incremented after updates.
|
||||||
|
`Name()` returns your module name.
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
const (
|
||||||
|
version = 1
|
||||||
|
name = "wordpress-module"
|
||||||
|
)
|
||||||
|
|
||||||
|
type WordpressModule struct{
|
||||||
|
// Cannot define fields as modules can't keep state.
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WordpressModule) Version() int {
|
||||||
|
return version
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WordpressModule) Name() string {
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! info
|
||||||
|
A struct cannot have any fields. Each method invocation is performed in different states.
|
||||||
|
|
||||||
|
#### Analyzer interface
|
||||||
|
If you implement the `Analyzer` interface, `Analyze` method is called when the file path is matched to file patterns returned by `RequiredFiles()`.
|
||||||
|
A file pattern must be a regular expression. The syntax detail is [here][regexp].
|
||||||
|
|
||||||
|
`Analyze` takes the matched file path, then the file can be opened by `os.Open()`.
|
||||||
|
|
||||||
|
```go
|
||||||
|
const typeWPVersion = "wordpress-version"
|
||||||
|
|
||||||
|
func (WordpressModule) RequiredFiles() []string {
|
||||||
|
return []string{
|
||||||
|
`wp-includes\/version.php`,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WordpressModule) Analyze(filePath string) (*serialize.AnalysisResult, error) {
|
||||||
|
f, err := os.Open(filePath) // e.g. filePath: /usr/src/wordpress/wp-includes/version.php
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
var wpVersion string
|
||||||
|
scanner := bufio.NewScanner(f)
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
if !strings.HasPrefix(line, "$wp_version=") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
ss := strings.Split(line, "=")
|
||||||
|
if len(ss) != 2 {
|
||||||
|
return nil, fmt.Errorf("invalid wordpress version: %s", line)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: it is an example; you actually need to handle comments, etc
|
||||||
|
ss[1] = strings.TrimSpace(ss[1])
|
||||||
|
wpVersion = strings.Trim(ss[1], `";`)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = scanner.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &serialize.AnalysisResult{
|
||||||
|
CustomResources: []serialize.CustomResource{
|
||||||
|
{
|
||||||
|
Type: typeWPVersion,
|
||||||
|
FilePath: filePath,
|
||||||
|
Data: wpVersion,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! tips
|
||||||
|
Trivy caches analysis results according to the module version.
|
||||||
|
We'd recommend cleaning the cache or changing the module version every time you update `Analyzer`.
|
||||||
|
|
||||||
|
|
||||||
|
#### PostScanner interface
|
||||||
|
`PostScan` is called after scanning and takes the scan result as an argument from Trivy.
|
||||||
|
In post scanning, your module can perform one of three actions:
|
||||||
|
|
||||||
|
- Insert
|
||||||
|
- Add a new security finding
|
||||||
|
- e.g. Add a new vulnerability and misconfiguration
|
||||||
|
- Update
|
||||||
|
- Update the detected vulnerability and misconfiguration
|
||||||
|
- e.g. Change a severity
|
||||||
|
- Delete
|
||||||
|
- Delete the detected vulnerability and misconfiguration
|
||||||
|
- e.g. Remove Spring4Shell because it is not actually affected.
|
||||||
|
|
||||||
|
`PostScanSpec()` returns which action the module does.
|
||||||
|
If it is `Update` or `Delete`, it also needs to return IDs such as CVE-ID and misconfiguration ID, which your module wants to update or delete.
|
||||||
|
|
||||||
|
`serialize.Results` contains the filtered results matching IDs you specified.
|
||||||
|
Also, it includes `CustomResources` with the values your `Analyze` returns, so you can modify the scan result according to the custom resources.
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (WordpressModule) PostScanSpec() serialize.PostScanSpec {
|
||||||
|
return serialize.PostScanSpec{
|
||||||
|
Action: api.ActionInsert, // Add new vulnerabilities
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WordpressModule) PostScan(results serialize.Results) (serialize.Results, error) {
|
||||||
|
// e.g. results
|
||||||
|
// [
|
||||||
|
// {
|
||||||
|
// "Target": "",
|
||||||
|
// "Class": "custom",
|
||||||
|
// "CustomResources": [
|
||||||
|
// {
|
||||||
|
// "Type": "wordpress-version",
|
||||||
|
// "FilePath": "/usr/src/wordpress/wp-includes/version.php",
|
||||||
|
// "Layer": {
|
||||||
|
// "DiffID": "sha256:057649e61046e02c975b84557c03c6cca095b8c9accd3bd20eb4e432f7aec887"
|
||||||
|
// },
|
||||||
|
// "Data": "5.7.1"
|
||||||
|
// }
|
||||||
|
// ]
|
||||||
|
// }
|
||||||
|
// ]
|
||||||
|
var wpVersion int
|
||||||
|
for _, result := range results {
|
||||||
|
if result.Class != types.ClassCustom {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, c := range result.CustomResources {
|
||||||
|
if c.Type != typeWPVersion {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
wpVersion = c.Data.(string)
|
||||||
|
wasm.Info(fmt.Sprintf("WordPress Version: %s", wpVersion))
|
||||||
|
|
||||||
|
...snip...
|
||||||
|
|
||||||
|
if affectedVersion.Check(ver) {
|
||||||
|
vulnerable = true
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if vulnerable {
|
||||||
|
// Add CVE-2020-36326
|
||||||
|
results = append(results, serialize.Result{
|
||||||
|
Target: wpPath,
|
||||||
|
Class: types.ClassLangPkg,
|
||||||
|
Type: "wordpress",
|
||||||
|
Vulnerabilities: []types.DetectedVulnerability {
|
||||||
|
{
|
||||||
|
VulnerabilityID: "CVE-2020-36326",
|
||||||
|
PkgName: "wordpress",
|
||||||
|
InstalledVersion: wpVersion,
|
||||||
|
FixedVersion: "5.7.2",
|
||||||
|
Vulnerability: dbTypes.Vulnerability{
|
||||||
|
Title: "PHPMailer 6.1.8 through 6.4.0 allows object injection through Phar Deserialization via addAttachment with a UNC pathname.",
|
||||||
|
Severity: "CRITICAL",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return results, nil
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The new vulnerability will be added to the scan results.
|
||||||
|
This example shows how the module inserts a new finding.
|
||||||
|
If you are interested in `Update`, you can see an example of [Spring4Shell][trivy-module-spring4shell].
|
||||||
|
|
||||||
|
In the `Delete` action, `PostScan` needs to return results you want to delete.
|
||||||
|
If `PostScan` returns an empty, Trivy will not delete anything.
|
||||||
|
|
||||||
|
#### Build
|
||||||
|
Follow [the install guide][tinygo-installation] and install TinyGo.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tinygo build -o wordpress.wasm -scheduler=none -target=wasi --no-debug wordpress.go
|
||||||
|
```
|
||||||
|
|
||||||
|
Put the built binary to the module directory that is under the home directory by default.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mkdir -p ~/.trivy/modules
|
||||||
|
$ cp spring4shell.wasm ~/.trivy/modules
|
||||||
|
```
|
||||||
|
|
||||||
|
## Distribute Your Module
|
||||||
|
You can distribute your own module in OCI registries. Please follow [the oras installation instruction][oras].
|
||||||
|
|
||||||
|
```bash
|
||||||
|
oras push ghcr.io/aquasecurity/trivy-module-wordpress:latest wordpress.wasm:application/vnd.module.wasm.content.layer.v1+wasm
|
||||||
|
Uploading 3daa3dac086b wordpress.wasm
|
||||||
|
Pushed ghcr.io/aquasecurity/trivy-module-wordpress:latest
|
||||||
|
Digest: sha256:6416d0199d66ce52ced19f01d75454b22692ff3aa7737e45f7a189880840424f
|
||||||
|
```
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
- [Spring4Shell][trivy-module-spring4shell]
|
||||||
|
- [WordPress][trivy-module-wordpress]
|
||||||
|
|
||||||
|
[regexp]: https://github.com/google/re2/wiki/Syntax
|
||||||
|
|
||||||
|
[tinygo]: https://tinygo.org/
|
||||||
|
[spring4shell]: https://blog.aquasec.com/zero-day-rce-vulnerability-spring4shell
|
||||||
|
[wazero]: https://github.com/tetratelabs/wazero
|
||||||
|
|
||||||
|
[trivy-module-spring4shell]: https://github.com/aquasecurity/trivy/tree/main/examples/module/spring4shell
|
||||||
|
[trivy-module-wordpress]: https://github.com/aquasecurity/trivy-module-wordpress
|
||||||
|
|
||||||
|
[tinygo-installation]: https://tinygo.org/getting-started/install/
|
||||||
|
[oras]: https://oras.land/cli/
|
||||||
173
docs/docs/advanced/plugins.md
Normal file
173
docs/docs/advanced/plugins.md
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
# Plugins
|
||||||
|
Trivy provides a plugin feature to allow others to extend the Trivy CLI without the need to change the Trivycode base.
|
||||||
|
This plugin system was inspired by the plugin system used in [kubectl][kubectl], [Helm][helm], and [Conftest][conftest].
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Trivy plugins are add-on tools that integrate seamlessly with Trivy.
|
||||||
|
They provide a way to extend the core feature set of Trivy, but without requiring every new feature to be written in Go and added to the core tool.
|
||||||
|
|
||||||
|
- They can be added and removed from a Trivy installation without impacting the core Trivy tool.
|
||||||
|
- They can be written in any programming language.
|
||||||
|
- They integrate with Trivy, and will show up in Trivy help and subcommands.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Trivy plugins available in public are not audited for security.
|
||||||
|
You should install and run third-party plugins at your own risk, since they are arbitrary programs running on your machine.
|
||||||
|
|
||||||
|
|
||||||
|
## Installing a Plugin
|
||||||
|
A plugin can be installed using the `trivy plugin install` command.
|
||||||
|
This command takes a url and will download the plugin and install it in the plugin cache.
|
||||||
|
|
||||||
|
Trivy adheres to the XDG specification, so the location depends on whether XDG_DATA_HOME is set.
|
||||||
|
Trivy will now search XDG_DATA_HOME for the location of the Trivy plugins cache.
|
||||||
|
The preference order is as follows:
|
||||||
|
|
||||||
|
- XDG_DATA_HOME if set and .trivy/plugins exists within the XDG_DATA_HOME dir
|
||||||
|
- ~/.trivy/plugins
|
||||||
|
|
||||||
|
Under the hood Trivy leverages [go-getter][go-getter] to download plugins.
|
||||||
|
This means the following protocols are supported for downloading plugins:
|
||||||
|
|
||||||
|
- OCI Registries
|
||||||
|
- Local Files
|
||||||
|
- Git
|
||||||
|
- HTTP/HTTPS
|
||||||
|
- Mercurial
|
||||||
|
- Amazon S3
|
||||||
|
- Google Cloud Storage
|
||||||
|
|
||||||
|
For example, to download the Kubernetes Trivy plugin you can execute the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy plugin install github.com/aquasecurity/trivy-plugin-kubectl
|
||||||
|
```
|
||||||
|
## Using Plugins
|
||||||
|
Once the plugin is installed, Trivy will load all available plugins in the cache on the start of the next Trivy execution.
|
||||||
|
A plugin will be made in the Trivy CLI based on the plugin name.
|
||||||
|
To display all plugins, you can list them by `trivy --help`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy --help
|
||||||
|
NAME:
|
||||||
|
trivy - A simple and comprehensive vulnerability scanner for containers
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy [global options] command [command options] target
|
||||||
|
|
||||||
|
VERSION:
|
||||||
|
dev
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
image, i scan an image
|
||||||
|
filesystem, fs scan local filesystem
|
||||||
|
repository, repo scan remote repository
|
||||||
|
client, c client mode
|
||||||
|
server, s server mode
|
||||||
|
plugin, p manage plugins
|
||||||
|
kubectl scan kubectl resources
|
||||||
|
help, h Shows a list of commands or help for one command
|
||||||
|
```
|
||||||
|
|
||||||
|
As shown above, `kubectl` subcommand exists in the `COMMANDS` section.
|
||||||
|
To call the kubectl plugin and scan existing Kubernetes deployments, you can execute the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy kubectl deployment <deployment-id> -- --ignore-unfixed --severity CRITICAL
|
||||||
|
```
|
||||||
|
|
||||||
|
Internally the kubectl plugin calls the kubectl binary to fetch information about that deployment and passes the using images to Trivy.
|
||||||
|
You can see the detail [here][trivy-plugin-kubectl].
|
||||||
|
|
||||||
|
If you want to omit even the subcommand, you can use `TRIVY_RUN_AS_PLUGIN` environment variable.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ TRIVY_RUN_AS_PLUGIN=kubectl trivy job your-job -- --format json
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installing and Running Plugins on the fly
|
||||||
|
`trivy plugin run` installs a plugin and runs it on the fly.
|
||||||
|
If the plugin is already present in the cache, the installation is skipped.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
trivy plugin run github.com/aquasecurity/trivy-plugin-kubectl pod your-pod -- --exit-code 1
|
||||||
|
```
|
||||||
|
|
||||||
|
## Uninstalling Plugins
|
||||||
|
Specify a plugin name with `trivy plugin uninstall` command.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy plugin uninstall kubectl
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building Plugins
|
||||||
|
Each plugin has a top-level directory, and then a plugin.yaml file.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
your-plugin/
|
||||||
|
|
|
||||||
|
|- plugin.yaml
|
||||||
|
|- your-plugin.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
In the example above, the plugin is contained inside of a directory named `your-plugin`.
|
||||||
|
It has two files: plugin.yaml (required) and an executable script, your-plugin.sh (optional).
|
||||||
|
|
||||||
|
The core of a plugin is a simple YAML file named plugin.yaml.
|
||||||
|
Here is an example YAML of trivy-plugin-kubectl plugin that adds support for Kubernetes scanning.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: "kubectl"
|
||||||
|
repository: github.com/aquasecurity/trivy-plugin-kubectl
|
||||||
|
version: "0.1.0"
|
||||||
|
usage: scan kubectl resources
|
||||||
|
description: |-
|
||||||
|
A Trivy plugin that scans the images of a kubernetes resource.
|
||||||
|
Usage: trivy kubectl TYPE[.VERSION][.GROUP] NAME
|
||||||
|
platforms:
|
||||||
|
- selector: # optional
|
||||||
|
os: darwin
|
||||||
|
arch: amd64
|
||||||
|
uri: ./trivy-kubectl # where the execution file is (local file, http, git, etc.)
|
||||||
|
bin: ./trivy-kubectl # path to the execution file
|
||||||
|
- selector: # optional
|
||||||
|
os: linux
|
||||||
|
arch: amd64
|
||||||
|
uri: https://github.com/aquasecurity/trivy-plugin-kubectl/releases/download/v0.1.0/trivy-kubectl.tar.gz
|
||||||
|
bin: ./trivy-kubectl
|
||||||
|
```
|
||||||
|
|
||||||
|
The `plugin.yaml` field should contain the following information:
|
||||||
|
|
||||||
|
- name: The name of the plugin. This also determines how the plugin will be made available in the Trivy CLI. For example, if the plugin is named kubectl, you can call the plugin with `trivy kubectl`. (required)
|
||||||
|
- version: The version of the plugin. (required)
|
||||||
|
- usage: A short usage description. (required)
|
||||||
|
- description: A long description of the plugin. This is where you could provide a helpful documentation of your plugin. (required)
|
||||||
|
- platforms: (required)
|
||||||
|
- selector: The OS/Architecture specific variations of a execution file. (optional)
|
||||||
|
- os: OS information based on GOOS (linux, darwin, etc.) (optional)
|
||||||
|
- arch: The architecture information based on GOARCH (amd64, arm64, etc.) (optional)
|
||||||
|
- uri: Where the executable file is. Relative path from the root directory of the plugin or remote URL such as HTTP and S3. (required)
|
||||||
|
- bin: Which file to call when the plugin is executed. Relative path from the root directory of the plugin. (required)
|
||||||
|
|
||||||
|
The following rules will apply in deciding which platform to select:
|
||||||
|
|
||||||
|
- If both `os` and `arch` under `selector` match the current platform, search will stop and the platform will be used.
|
||||||
|
- If `selector` is not present, the platform will be used.
|
||||||
|
- If `os` matches and there is no more specific `arch` match, the platform will be used.
|
||||||
|
- If no `platform` match is found, Trivy will exit with an error.
|
||||||
|
|
||||||
|
After determining platform, Trivy will download the execution file from `uri` and store it in the plugin cache.
|
||||||
|
When the plugin is called via Trivy CLI, `bin` command will be executed.
|
||||||
|
|
||||||
|
The plugin is responsible for handling flags and arguments. Any arguments are passed to the plugin from the `trivy` command.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
https://github.com/aquasecurity/trivy-plugin-kubectl
|
||||||
|
|
||||||
|
[kubectl]: https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/
|
||||||
|
[helm]: https://helm.sh/docs/topics/plugins/
|
||||||
|
[conftest]: https://www.conftest.dev/plugins/
|
||||||
|
[go-getter]: https://github.com/hashicorp/go-getter
|
||||||
|
[trivy-plugin-kubectl]: https://github.com/aquasecurity/trivy-plugin-kubectl
|
||||||
|
|
||||||
27
docs/docs/advanced/private-registries/acr.md
Normal file
27
docs/docs/advanced/private-registries/acr.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Requirements
|
||||||
|
None, Trivy uses Azure SDK for Go. You don't need to install `az` command.
|
||||||
|
|
||||||
|
# Privileges
|
||||||
|
Service principal must have the `AcrPull` permissions.
|
||||||
|
|
||||||
|
## Creation of a service principal
|
||||||
|
```bash
|
||||||
|
export SP_DATA=$(az ad sp create-for-rbac --name TrivyTest --role AcrPull --scope "/subscriptions/<subscription_id>/resourceGroups/<resource_group>/providers/Microsoft.ContainerRegistry/registries/<registry_name>")
|
||||||
|
```
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
```bash
|
||||||
|
# must set TRIVY_USERNAME empty char
|
||||||
|
export AZURE_CLIENT_ID$(echo $SP_DATA | jq -r .appId)
|
||||||
|
export AZURE_CLIENT_SECRET$(echo $SP_DATA | jq -r .password)
|
||||||
|
export AZURE_TENANT_ID$(echo $SP_DATA | jq -r .tenant)
|
||||||
|
```
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
You can test credentials in the following manner.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -it --rm -v /tmp:/tmp\
|
||||||
|
-e AZURE_CLIENT_ID=${AZURE_CLIENT_ID} -e AZURE_CLIENT_SECRET=${AZURE_CLIENT_SECRET} \
|
||||||
|
-e AZURE_TENANT_ID=${AZURE_TENANT_ID} aquasec/trivy image your_special_project.azurecr.io/your_special_image:your_special_tag
|
||||||
|
```
|
||||||
7
docs/docs/advanced/private-registries/docker-hub.md
Normal file
7
docs/docs/advanced/private-registries/docker-hub.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Docker Hub needs `TRIVY_USERNAME` and `TRIVY_PASSWORD`.
|
||||||
|
You don't need to set ENV vars when download from public repository.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export TRIVY_USERNAME={DOCKERHUB_USERNAME}
|
||||||
|
export TRIVY_PASSWORD={DOCKERHUB_PASSWORD}
|
||||||
|
```
|
||||||
4
docs/docs/advanced/private-registries/ecr.md
Normal file
4
docs/docs/advanced/private-registries/ecr.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
Trivy uses AWS SDK. You don't need to install `aws` CLI tool.
|
||||||
|
You can use [AWS CLI's ENV Vars][env-var].
|
||||||
|
|
||||||
|
[env-var]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html
|
||||||
40
docs/docs/advanced/private-registries/gcr.md
Normal file
40
docs/docs/advanced/private-registries/gcr.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Requirements
|
||||||
|
None, Trivy uses Google Cloud SDK. You don't need to install `gcloud` command.
|
||||||
|
|
||||||
|
# Privileges
|
||||||
|
Credential file must have the `roles/storage.objectViewer` permissions.
|
||||||
|
More information can be found in [Google's documentation](https://cloud.google.com/container-registry/docs/access-control)
|
||||||
|
|
||||||
|
## JSON File Format
|
||||||
|
The JSON file specified should have the following format provided by google's service account mechanisms:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "service_account",
|
||||||
|
"project_id": "your_special_project",
|
||||||
|
"private_key_id": "XXXXXXXXXXXXXXXXXXXXxx",
|
||||||
|
"private_key": "-----BEGIN PRIVATE KEY-----\nNONONONO\n-----END PRIVATE KEY-----\n",
|
||||||
|
"client_email": "somedude@your_special_project.iam.gserviceaccount.com",
|
||||||
|
"client_id": "1234567890",
|
||||||
|
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
|
||||||
|
"token_uri": "https://oauth2.googleapis.com/token",
|
||||||
|
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
|
||||||
|
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/somedude%40your_special_project.iam.gserviceaccount.com"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Usage
|
||||||
|
If you want to use target project's repository, you can set them via `GOOGLE_APPLICATION_CREDENTIALS`.
|
||||||
|
```bash
|
||||||
|
# must set TRIVY_USERNAME empty char
|
||||||
|
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credential.json
|
||||||
|
```
|
||||||
|
|
||||||
|
# Testing
|
||||||
|
You can test credentials in the following manner (assuming they are in `/tmp` on host machine).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker run -it --rm -v /tmp:/tmp\
|
||||||
|
-e GOOGLE_APPLICATION_CREDENTIALS=/tmp/service_account.json\
|
||||||
|
aquasec/trivy image gcr.io/your_special_project/your_special_image:your_special_tag
|
||||||
|
```
|
||||||
4
docs/docs/advanced/private-registries/index.md
Normal file
4
docs/docs/advanced/private-registries/index.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
Trivy can download images from a private registry, without installing `Docker` or any other 3rd party tools.
|
||||||
|
That's because it's easy to run in a CI process.
|
||||||
|
|
||||||
|
All you have to do is install `Trivy` and set ENV vars.
|
||||||
9
docs/docs/advanced/private-registries/self.md
Normal file
9
docs/docs/advanced/private-registries/self.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
BasicAuth server needs `TRIVY_USERNAME` and `TRIVY_PASSWORD`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export TRIVY_USERNAME={USERNAME}
|
||||||
|
export TRIVY_PASSWORD={PASSWORD}
|
||||||
|
|
||||||
|
# if you want to use 80 port, use NonSSL
|
||||||
|
export TRIVY_NON_SSL=true
|
||||||
|
```
|
||||||
93
docs/docs/index.md
Normal file
93
docs/docs/index.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# Docs
|
||||||
|
|
||||||
|
Trivy detects two types of security issues:
|
||||||
|
|
||||||
|
- [Vulnerabilities][vuln]
|
||||||
|
- [Misconfigurations][misconf]
|
||||||
|
|
||||||
|
Trivy can scan four different artifacts:
|
||||||
|
|
||||||
|
- [Container Images][container]
|
||||||
|
- [Filesystem][filesystem] and [Rootfs][rootfs]
|
||||||
|
- [Git Repositories][repo]
|
||||||
|
- [Kubernetes][kubernetes]
|
||||||
|
|
||||||
|
Trivy can be run in two different modes:
|
||||||
|
|
||||||
|
- [Standalone][standalone]
|
||||||
|
- [Client/Server][client-server]
|
||||||
|
|
||||||
|
Trivy can be run as a Kubernetes Operator:
|
||||||
|
|
||||||
|
- [Kubernetes Operator][kubernetesoperator]
|
||||||
|
|
||||||
|
It is designed to be used in CI. Before pushing to a container registry or deploying your application, you can scan your local container image and other artifacts easily.
|
||||||
|
See [Integrations][integrations] for details.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Comprehensive vulnerability detection
|
||||||
|
- [OS packages][os] (Alpine, Red Hat Universal Base Image, Red Hat Enterprise Linux, CentOS, AlmaLinux, Rocky Linux, CBL-Mariner, Oracle Linux, Debian, Ubuntu, Amazon Linux, openSUSE Leap, SUSE Enterprise Linux, Photon OS and Distroless)
|
||||||
|
- [**Language-specific packages**][lang] (Bundler, Composer, Pipenv, Poetry, npm, yarn, Cargo, NuGet, Maven, and Go)
|
||||||
|
- Detect IaC misconfigurations
|
||||||
|
- A wide variety of [built-in policies][builtin] are provided **out of the box**:
|
||||||
|
- Kubernetes
|
||||||
|
- Docker
|
||||||
|
- Terraform
|
||||||
|
- more coming soon
|
||||||
|
- Support custom policies
|
||||||
|
- Simple
|
||||||
|
- Specify only an image name, a directory containing IaC configs, or an artifact name
|
||||||
|
- See [Quick Start][quickstart]
|
||||||
|
- Fast
|
||||||
|
- The first scan will finish within 10 seconds (depending on your network). Consequent scans will finish in single seconds.
|
||||||
|
- Unlike other scanners that take long to fetch vulnerability information (~10 minutes) on the first run, and encourage you to maintain a durable vulnerability database, Trivy is stateless and requires no maintenance or preparation.
|
||||||
|
- Easy installation
|
||||||
|
- `apt-get install`, `yum install` and `brew install` is possible (See [Installation][installation])
|
||||||
|
- **No pre-requisites** such as installation of DB, libraries, etc.
|
||||||
|
- High accuracy
|
||||||
|
- **Especially Alpine Linux and RHEL/CentOS**
|
||||||
|
- Other OSes are also high
|
||||||
|
- DevSecOps
|
||||||
|
- **Suitable for CI** such as Travis CI, CircleCI, Jenkins, GitLab CI, etc.
|
||||||
|
- See [CI Example][integrations]
|
||||||
|
- Support multiple formats
|
||||||
|
- container image
|
||||||
|
- A local image in Docker Engine which is running as a daemon
|
||||||
|
- A local image in [Podman][podman] (>=2.0) which is exposing a socket
|
||||||
|
- A remote image in Docker Registry such as Docker Hub, ECR, GCR and ACR
|
||||||
|
- A tar archive stored in the `docker save` / `podman save` formatted file
|
||||||
|
- An image directory compliant with [OCI Image Format][oci]
|
||||||
|
- local filesystem and rootfs
|
||||||
|
- remote git repository
|
||||||
|
- [SBOM][sbom] (Software Bill of Materials) support
|
||||||
|
- CycloneDX
|
||||||
|
- SPDX
|
||||||
|
|
||||||
|
Please see [LICENSE][license] for Trivy licensing information.
|
||||||
|
|
||||||
|
[installation]: ../getting-started/installation.md
|
||||||
|
[vuln]: ../docs/vulnerability/scanning/index.md
|
||||||
|
[misconf]: ../docs/misconfiguration/scanning.md
|
||||||
|
[kubernetesoperator]: ../docs/kubernetes/operator/index.md
|
||||||
|
[container]: ../docs/vulnerability/scanning/image.md
|
||||||
|
[rootfs]: ../docs/vulnerability/scanning/rootfs.md
|
||||||
|
[filesystem]: ../docs/vulnerability/scanning/filesystem.md
|
||||||
|
[repo]: ../docs/vulnerability/scanning/git-repository.md
|
||||||
|
[kubernetes]: ../docs/kubernetes/cli/scanning.md
|
||||||
|
|
||||||
|
[standalone]: ../docs/references/modes/standalone.md
|
||||||
|
[client-server]: ../docs/references/modes/client-server.md
|
||||||
|
[integrations]: ../docs/integrations/index.md
|
||||||
|
|
||||||
|
[os]: ../docs/vulnerability/detection/os.md
|
||||||
|
[lang]: ../docs/vulnerability/detection/language.md
|
||||||
|
|
||||||
|
[builtin]: ../docs/misconfiguration/policy/builtin.md
|
||||||
|
[quickstart]: ../getting-started/quickstart.md
|
||||||
|
[podman]: ../docs/advanced/container/podman.md
|
||||||
|
|
||||||
|
[sbom]: ../docs/sbom/index.md
|
||||||
|
|
||||||
|
[oci]: https://github.com/opencontainers/image-spec
|
||||||
|
[license]: https://github.com/aquasecurity/trivy/blob/main/LICENSE
|
||||||
4
docs/docs/integrations/aws-codepipeline.md
Normal file
4
docs/docs/integrations/aws-codepipeline.md
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# AWS CodePipeline
|
||||||
|
See [this blog post][blog] for an example of using Trivy within AWS CodePipeline.
|
||||||
|
|
||||||
|
[blog]: https://aws.amazon.com/blogs/containers/scanning-images-with-trivy-in-an-aws-codepipeline/
|
||||||
@@ -17,7 +17,7 @@ $ aws securityhub batch-import-findings --findings file://report.asff
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Customize
|
## Customize
|
||||||
You can customize [asff.tpl](../../contrib/asff.tpl).
|
You can customize [asff.tpl](https://github.com/aquasecurity/trivy/blob/main/contrib/asff.tpl)
|
||||||
|
|
||||||
```
|
```
|
||||||
$ export AWS_REGION=us-west-1
|
$ export AWS_REGION=us-west-1
|
||||||
5
docs/docs/integrations/bitbucket.md
Normal file
5
docs/docs/integrations/bitbucket.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Bitbucket Pipelines
|
||||||
|
|
||||||
|
See [trivy-pipe][trivy-pipe] for the details.
|
||||||
|
|
||||||
|
[trivy-pipe]: https://github.com/aquasecurity/trivy-pipe
|
||||||
34
docs/docs/integrations/circleci.md
Normal file
34
docs/docs/integrations/circleci.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# CircleCI
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat .circleci/config.yml
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
docker:
|
||||||
|
- image: docker:stable-git
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- setup_remote_docker
|
||||||
|
- run:
|
||||||
|
name: Build image
|
||||||
|
command: docker build -t trivy-ci-test:${CIRCLE_SHA1} .
|
||||||
|
- run:
|
||||||
|
name: Install trivy
|
||||||
|
command: |
|
||||||
|
apk add --update-cache --upgrade curl
|
||||||
|
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
|
||||||
|
- run:
|
||||||
|
name: Scan the local image with trivy
|
||||||
|
command: trivy image --exit-code 0 --no-progress trivy-ci-test:${CIRCLE_SHA1}
|
||||||
|
workflows:
|
||||||
|
version: 2
|
||||||
|
release:
|
||||||
|
jobs:
|
||||||
|
- build
|
||||||
|
```
|
||||||
|
|
||||||
|
[Example][example]
|
||||||
|
[Repository][repository]
|
||||||
|
|
||||||
|
[example]: https://circleci.com/gh/aquasecurity/trivy-ci-test
|
||||||
|
[repository]: https://github.com/aquasecurity/trivy-ci-test
|
||||||
9
docs/docs/integrations/github-actions.md
Normal file
9
docs/docs/integrations/github-actions.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# GitHub Actions
|
||||||
|
|
||||||
|
- Here is the [Trivy GitHub Action][action]
|
||||||
|
- The Microsoft Azure team have written a [container-scan action][azure] that uses Trivy and Dockle
|
||||||
|
- For full control over the options specified to Trivy, this [blog post][blog] describes adding Trivy into your own GitHub action workflows
|
||||||
|
|
||||||
|
[action]: https://github.com/aquasecurity/trivy-action
|
||||||
|
[azure]: https://github.com/Azure/container-scan
|
||||||
|
[blog]: https://blog.aquasec.com/devsecops-with-trivy-github-actions
|
||||||
181
docs/docs/integrations/gitlab-ci.md
Normal file
181
docs/docs/integrations/gitlab-ci.md
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
# GitLab CI
|
||||||
|
|
||||||
|
GitLab 15.0 includes [free](https://gitlab.com/groups/gitlab-org/-/epics/2233) integration with Trivy.
|
||||||
|
|
||||||
|
To [configure container scanning with Trivy in GitLab](https://docs.gitlab.com/ee/user/application_security/container_scanning/#configuration), simply include the CI template in your `.gitlab-ci.yml` file:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
include:
|
||||||
|
- template: Security/Container-Scanning.gitlab-ci.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're a GitLab 14.x Ultimate customer, you can use the same configuration above.
|
||||||
|
|
||||||
|
Alternatively, you can always use the example configurations below. Note that the examples use [`contrib/gitlab.tpl`](https://github.com/aquasecurity/trivy/blob/main/contrib/gitlab.tpl), which does not work with GitLab 15.0 and above (for details, see [issue 1598](https://github.com/aquasecurity/trivy/issues/1598)).
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
|
||||||
|
trivy:
|
||||||
|
stage: test
|
||||||
|
image: docker:stable
|
||||||
|
services:
|
||||||
|
- name: docker:dind
|
||||||
|
entrypoint: ["env", "-u", "DOCKER_HOST"]
|
||||||
|
command: ["dockerd-entrypoint.sh"]
|
||||||
|
variables:
|
||||||
|
DOCKER_HOST: tcp://docker:2375/
|
||||||
|
DOCKER_DRIVER: overlay2
|
||||||
|
# See https://github.com/docker-library/docker/pull/166
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
IMAGE: trivy-ci-test:$CI_COMMIT_SHA
|
||||||
|
TRIVY_NO_PROGRESS: "true"
|
||||||
|
TRIVY_CACHE_DIR: ".trivycache/"
|
||||||
|
before_script:
|
||||||
|
- export TRIVY_VERSION=$(wget -qO - "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
|
||||||
|
- echo $TRIVY_VERSION
|
||||||
|
- wget --no-verbose https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz -O - | tar -zxvf -
|
||||||
|
allow_failure: true
|
||||||
|
script:
|
||||||
|
# Build image
|
||||||
|
- docker build -t $IMAGE .
|
||||||
|
# Build report
|
||||||
|
- ./trivy image --exit-code 0 --format template --template "@contrib/gitlab.tpl" -o gl-container-scanning-report.json $IMAGE
|
||||||
|
# Print report
|
||||||
|
- ./trivy image --exit-code 0 --severity HIGH $IMAGE
|
||||||
|
# Fail on severe vulnerabilities
|
||||||
|
- ./trivy image --exit-code 1 --severity CRITICAL $IMAGE
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- .trivycache/
|
||||||
|
# Enables https://docs.gitlab.com/ee/user/application_security/container_scanning/ (Container Scanning report is available on GitLab EE Ultimate or GitLab.com Gold)
|
||||||
|
artifacts:
|
||||||
|
reports:
|
||||||
|
container_scanning: gl-container-scanning-report.json
|
||||||
|
```
|
||||||
|
|
||||||
|
[Example][example]
|
||||||
|
[Repository][repository]
|
||||||
|
|
||||||
|
### GitLab CI using Trivy container
|
||||||
|
|
||||||
|
To scan a previously built image that has already been pushed into the
|
||||||
|
GitLab container registry the following CI job manifest can be used.
|
||||||
|
Note that `entrypoint` needs to be unset for the `script` section to work.
|
||||||
|
In case of a non-public GitLab project Trivy additionally needs to
|
||||||
|
authenticate to the registry to be able to pull your application image.
|
||||||
|
Finally, it is not necessary to clone the project repo as we only work
|
||||||
|
with the container image.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
container_scanning:
|
||||||
|
image:
|
||||||
|
name: docker.io/aquasec/trivy:latest
|
||||||
|
entrypoint: [""]
|
||||||
|
variables:
|
||||||
|
# No need to clone the repo, we exclusively work on artifacts. See
|
||||||
|
# https://docs.gitlab.com/ee/ci/runners/README.html#git-strategy
|
||||||
|
GIT_STRATEGY: none
|
||||||
|
TRIVY_USERNAME: "$CI_REGISTRY_USER"
|
||||||
|
TRIVY_PASSWORD: "$CI_REGISTRY_PASSWORD"
|
||||||
|
TRIVY_AUTH_URL: "$CI_REGISTRY"
|
||||||
|
TRIVY_NO_PROGRESS: "true"
|
||||||
|
TRIVY_CACHE_DIR: ".trivycache/"
|
||||||
|
FULL_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
|
||||||
|
script:
|
||||||
|
- trivy --version
|
||||||
|
# cache cleanup is needed when scanning images with the same tags, it does not remove the database
|
||||||
|
- time trivy image --clear-cache
|
||||||
|
# update vulnerabilities db
|
||||||
|
- time trivy image --download-db-only
|
||||||
|
# Builds report and puts it in the default workdir $CI_PROJECT_DIR, so `artifacts:` can take it from there
|
||||||
|
- time trivy image --exit-code 0 --format template --template "@/contrib/gitlab.tpl"
|
||||||
|
--output "$CI_PROJECT_DIR/gl-container-scanning-report.json" "$FULL_IMAGE_NAME"
|
||||||
|
# Prints full report
|
||||||
|
- time trivy image --exit-code 0 "$FULL_IMAGE_NAME"
|
||||||
|
# Fail on critical vulnerabilities
|
||||||
|
- time trivy image --exit-code 1 --severity CRITICAL "$FULL_IMAGE_NAME"
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- .trivycache/
|
||||||
|
# Enables https://docs.gitlab.com/ee/user/application_security/container_scanning/ (Container Scanning report is available on GitLab EE Ultimate or GitLab.com Gold)
|
||||||
|
artifacts:
|
||||||
|
when: always
|
||||||
|
reports:
|
||||||
|
container_scanning: gl-container-scanning-report.json
|
||||||
|
tags:
|
||||||
|
- docker-runner
|
||||||
|
```
|
||||||
|
|
||||||
|
[example]: https://gitlab.com/aquasecurity/trivy-ci-test/pipelines
|
||||||
|
[repository]: https://github.com/aquasecurity/trivy-ci-test
|
||||||
|
|
||||||
|
### GitLab CI alternative template
|
||||||
|
|
||||||
|
Depending on the edition of gitlab you have or your desired workflow, the
|
||||||
|
container scanning template may not meet your needs. As an addition to the
|
||||||
|
above container scanning template, a template for
|
||||||
|
[code climate](https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html)
|
||||||
|
has been included. The key things to update from the above examples are
|
||||||
|
the `template` and `report` type. An updated example is below.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
|
||||||
|
trivy:
|
||||||
|
stage: test
|
||||||
|
image: docker:stable
|
||||||
|
services:
|
||||||
|
- name: docker:dind
|
||||||
|
entrypoint: ["env", "-u", "DOCKER_HOST"]
|
||||||
|
command: ["dockerd-entrypoint.sh"]
|
||||||
|
variables:
|
||||||
|
DOCKER_HOST: tcp://docker:2375/
|
||||||
|
DOCKER_DRIVER: overlay2
|
||||||
|
# See https://github.com/docker-library/docker/pull/166
|
||||||
|
DOCKER_TLS_CERTDIR: ""
|
||||||
|
IMAGE: trivy-ci-test:$CI_COMMIT_SHA
|
||||||
|
TRIVY_NO_PROGRESS: "true"
|
||||||
|
TRIVY_CACHE_DIR: ".trivycache/"
|
||||||
|
before_script:
|
||||||
|
- export TRIVY_VERSION=$(wget -qO - "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
|
||||||
|
- echo $TRIVY_VERSION
|
||||||
|
- wget --no-verbose https://github.com/aquasecurity/trivy/releases/download/v${TRIVY_VERSION}/trivy_${TRIVY_VERSION}_Linux-64bit.tar.gz -O - | tar -zxvf -
|
||||||
|
allow_failure: true
|
||||||
|
script:
|
||||||
|
# Build image
|
||||||
|
- docker build -t $IMAGE .
|
||||||
|
# Image report
|
||||||
|
- ./trivy image --exit-code 0 --format template --template "@contrib/gitlab-codequality.tpl" -o gl-codeclimate-image.json $IMAGE
|
||||||
|
# Filesystem report
|
||||||
|
- ./trivy filesystem --security-checks config,vuln --exit-code 0 --format template --template "@contrib/gitlab-codequality.tpl" -o gl-codeclimate-fs.json .
|
||||||
|
# Combine report
|
||||||
|
- apk update && apk add jq
|
||||||
|
- jq -s 'add' gl-codeclimate-image.json gl-codeclimate-fs.json > gl-codeclimate.json
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- .trivycache/
|
||||||
|
# Enables https://docs.gitlab.com/ee/user/application_security/container_scanning/ (Container Scanning report is available on GitLab EE Ultimate or GitLab.com Gold)
|
||||||
|
artifacts:
|
||||||
|
paths:
|
||||||
|
- gl-codeclimate.json
|
||||||
|
reports:
|
||||||
|
codequality: gl-codeclimate.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Currently gitlab only supports a single code quality report. There is an
|
||||||
|
open [feature request](https://gitlab.com/gitlab-org/gitlab/-/issues/9014)
|
||||||
|
to support multiple reports. Until this has been implemented, if you
|
||||||
|
already have a code quality report in your pipeline, you can use
|
||||||
|
`jq` to combine reports. Depending on how you name your artifacts, it may
|
||||||
|
be necessary to rename the artifact if you want to reuse the name. To then
|
||||||
|
combine the previous artifact with the output of trivy, the following `jq`
|
||||||
|
command can be used, `jq -s 'add' prev-codeclimate.json trivy-codeclimate.json > gl-codeclimate.json`.
|
||||||
|
|
||||||
|
### GitLab CI alternative template example report
|
||||||
|
|
||||||
|
You'll be able to see a full report in the GitLab pipeline code quality UI, where filesystem vulnerabilities and misconfigurations include links to the flagged files and image vulnerabilities report the image/os or runtime/library that the vulnerability originates from instead.
|
||||||
|
|
||||||
|

|
||||||
2
docs/docs/integrations/index.md
Normal file
2
docs/docs/integrations/index.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Integrations
|
||||||
|
Scan your image automatically as part of your CI workflow, failing the workflow if a vulnerability is found. When you don't want to fail the test, specify `--exit-code 0`.
|
||||||
29
docs/docs/integrations/travis-ci.md
Normal file
29
docs/docs/integrations/travis-ci.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Travis CI
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat .travis.yml
|
||||||
|
services:
|
||||||
|
- docker
|
||||||
|
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- COMMIT=${TRAVIS_COMMIT::8}
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- docker build -t trivy-ci-test:${COMMIT} .
|
||||||
|
- export VERSION=$(curl --silent "https://api.github.com/repos/aquasecurity/trivy/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
|
||||||
|
- wget https://github.com/aquasecurity/trivy/releases/download/v${VERSION}/trivy_${VERSION}_Linux-64bit.tar.gz
|
||||||
|
- tar zxvf trivy_${VERSION}_Linux-64bit.tar.gz
|
||||||
|
script:
|
||||||
|
- ./trivy image --exit-code 0 --severity HIGH --no-progress trivy-ci-test:${COMMIT}
|
||||||
|
- ./trivy image --exit-code 1 --severity CRITICAL --no-progress trivy-ci-test:${COMMIT}
|
||||||
|
cache:
|
||||||
|
directories:
|
||||||
|
- $HOME/.cache/trivy
|
||||||
|
```
|
||||||
|
|
||||||
|
[Example][example]
|
||||||
|
[Repository][repository]
|
||||||
|
|
||||||
|
[example]: https://travis-ci.org/aquasecurity/trivy-ci-test
|
||||||
|
[repository]: https://github.com/aquasecurity/trivy-ci-test
|
||||||
220
docs/docs/kubernetes/cli/scanning.md
Normal file
220
docs/docs/kubernetes/cli/scanning.md
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
# Kubernetes
|
||||||
|
|
||||||
|
!!! warning "EXPERIMENTAL"
|
||||||
|
This feature might change without preserving backwards compatibility.
|
||||||
|
|
||||||
|
The Trivy K8s CLI allows you to scan your Kubernetes cluster for Vulnerabilities, Secrets and Misconfigurations. You can either run the CLI locally or integrate it into your CI/CD pipeline. The difference to the Trivy CLI is that the Trivy K8s CLI allows you to scan running workloads directly within your cluster.
|
||||||
|
|
||||||
|
If you are looking for continuous cluster audit scanning, have a look at the [Trivy K8s operator.](../operator/getting-started.md)
|
||||||
|
|
||||||
|
Trivy uses your local kubectl configuration to access the API server to list artifacts.
|
||||||
|
|
||||||
|
## CLI Commands
|
||||||
|
|
||||||
|
Scan a full cluster and generate a simple summary report:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s --report=summary cluster
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The summary report is the default. To get all of the detail the output contains, use `--report all`.
|
||||||
|
|
||||||
|
Filter by severity:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s --severity=CRITICAL --report=all cluster
|
||||||
|
```
|
||||||
|
|
||||||
|
Filter by security check (Vulnerabilities, Secrets or Misconfigurations):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s --security-checks=secret --report=summary cluster
|
||||||
|
# or
|
||||||
|
$ trivy k8s --security-checks=config --report=summary cluster
|
||||||
|
```
|
||||||
|
|
||||||
|
Scan a specific namespace:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s -n kube-system --report=summary all
|
||||||
|
```
|
||||||
|
|
||||||
|
Scan a specific resource and get all the output:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s deployment appname
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to pass in flags before scanning specific workloads, you will have to do it before the resource name.
|
||||||
|
For example, scanning a deployment in the app namespace of your Kubernetes cluster for critical vulnerabilities would be done through the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s -n app --severity=CRITICAL deployment/appname
|
||||||
|
```
|
||||||
|
This is specific to all Trivy CLI commands.
|
||||||
|
|
||||||
|
The supported formats are `table`, which is the default, and `json`.
|
||||||
|
To get a JSON output on a full cluster scan:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy k8s --format json -o results.json cluster
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"ClusterName": "minikube",
|
||||||
|
"Vulnerabilities": [
|
||||||
|
{
|
||||||
|
"Namespace": "default",
|
||||||
|
"Kind": "Deployment",
|
||||||
|
"Name": "app",
|
||||||
|
"Results": [
|
||||||
|
{
|
||||||
|
"Target": "ubuntu:latest (ubuntu 22.04)",
|
||||||
|
"Class": "os-pkgs",
|
||||||
|
"Type": "ubuntu",
|
||||||
|
"Vulnerabilities": [
|
||||||
|
{
|
||||||
|
"VulnerabilityID": "CVE-2016-2781",
|
||||||
|
"PkgName": "coreutils",
|
||||||
|
"InstalledVersion": "8.32-4.1ubuntu1",
|
||||||
|
"Layer": {
|
||||||
|
"Digest": "sha256:125a6e411906fe6b0aaa50fc9d600bf6ff9bb11a8651727ce1ed482dc271c24c",
|
||||||
|
"DiffID": "sha256:e59fc94956120a6c7629f085027578e6357b48061d45714107e79f04a81a6f0c"
|
||||||
|
},
|
||||||
|
"SeveritySource": "ubuntu",
|
||||||
|
"PrimaryURL": "https://avd.aquasec.com/nvd/cve-2016-2781",
|
||||||
|
"DataSource": {
|
||||||
|
"ID": "ubuntu",
|
||||||
|
"Name": "Ubuntu CVE Tracker",
|
||||||
|
"URL": "https://git.launchpad.net/ubuntu-cve-tracker"
|
||||||
|
},
|
||||||
|
"Title": "coreutils: Non-privileged session can escape to the parent session in chroot",
|
||||||
|
"Description": "chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.",
|
||||||
|
"Severity": "LOW",
|
||||||
|
"CweIDs": [
|
||||||
|
"CWE-20"
|
||||||
|
],
|
||||||
|
"VendorSeverity": {
|
||||||
|
"cbl-mariner": 2,
|
||||||
|
"nvd": 2,
|
||||||
|
"redhat": 2,
|
||||||
|
"ubuntu": 1
|
||||||
|
},
|
||||||
|
"CVSS": {
|
||||||
|
"nvd": {
|
||||||
|
"V2Vector": "AV:L/AC:L/Au:N/C:N/I:P/A:N",
|
||||||
|
"V3Vector": "CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N",
|
||||||
|
"V2Score": 2.1,
|
||||||
|
"V3Score": 6.5
|
||||||
|
},
|
||||||
|
"redhat": {
|
||||||
|
"V2Vector": "AV:L/AC:H/Au:N/C:C/I:C/A:C",
|
||||||
|
"V3Vector": "CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H",
|
||||||
|
"V2Score": 6.2,
|
||||||
|
"V3Score": 8.6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"References": [
|
||||||
|
"http://seclists.org/oss-sec/2016/q1/452",
|
||||||
|
"http://www.openwall.com/lists/oss-security/2016/02/28/2",
|
||||||
|
"http://www.openwall.com/lists/oss-security/2016/02/28/3",
|
||||||
|
"https://access.redhat.com/security/cve/CVE-2016-2781",
|
||||||
|
"https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-2781",
|
||||||
|
"https://lists.apache.org/thread.html/rf9fa47ab66495c78bb4120b0754dd9531ca2ff0430f6685ac9b07772@%3Cdev.mina.apache.org%3E",
|
||||||
|
"https://lore.kernel.org/patchwork/patch/793178/",
|
||||||
|
"https://nvd.nist.gov/vuln/detail/CVE-2016-2781"
|
||||||
|
],
|
||||||
|
"PublishedDate": "2017-02-07T15:59:00Z",
|
||||||
|
"LastModifiedDate": "2021-02-25T17:15:00Z"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Misconfigurations": [
|
||||||
|
{
|
||||||
|
"Namespace": "default",
|
||||||
|
"Kind": "Deployment",
|
||||||
|
"Name": "app",
|
||||||
|
"Results": [
|
||||||
|
{
|
||||||
|
"Target": "Deployment/app",
|
||||||
|
"Class": "config",
|
||||||
|
"Type": "kubernetes",
|
||||||
|
"MisconfSummary": {
|
||||||
|
"Successes": 20,
|
||||||
|
"Failures": 19,
|
||||||
|
"Exceptions": 0
|
||||||
|
},
|
||||||
|
"Misconfigurations": [
|
||||||
|
{
|
||||||
|
"Type": "Kubernetes Security Check",
|
||||||
|
"ID": "KSV001",
|
||||||
|
"Title": "Process can elevate its own privileges",
|
||||||
|
"Description": "A program inside the container can elevate its own privileges and run as root, which might give the program control over the container and node.",
|
||||||
|
"Message": "Container 'app' of Deployment 'app' should set 'securityContext.allowPrivilegeEscalation' to false",
|
||||||
|
"Namespace": "builtin.kubernetes.KSV001",
|
||||||
|
"Query": "data.builtin.kubernetes.KSV001.deny",
|
||||||
|
"Resolution": "Set 'set containers[].securityContext.allowPrivilegeEscalation' to 'false'.",
|
||||||
|
"Severity": "MEDIUM",
|
||||||
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/ksv001",
|
||||||
|
"References": [
|
||||||
|
"https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted",
|
||||||
|
"https://avd.aquasec.com/misconfig/ksv001"
|
||||||
|
],
|
||||||
|
"Status": "FAIL",
|
||||||
|
"Layer": {},
|
||||||
|
"IacMetadata": {
|
||||||
|
"Provider": "Kubernetes",
|
||||||
|
"Service": "general",
|
||||||
|
"StartLine": 121,
|
||||||
|
"EndLine": 133
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "Kubernetes Security Check",
|
||||||
|
"ID": "KSV003",
|
||||||
|
"Title": "Default capabilities not dropped",
|
||||||
|
"Description": "The container should drop all default capabilities and add only those that are needed for its execution.",
|
||||||
|
"Message": "Container 'app' of Deployment 'app' should add 'ALL' to 'securityContext.capabilities.drop'",
|
||||||
|
"Namespace": "builtin.kubernetes.KSV003",
|
||||||
|
"Query": "data.builtin.kubernetes.KSV003.deny",
|
||||||
|
"Resolution": "Add 'ALL' to containers[].securityContext.capabilities.drop.",
|
||||||
|
"Severity": "LOW",
|
||||||
|
"PrimaryURL": "https://avd.aquasec.com/misconfig/ksv003",
|
||||||
|
"References": [
|
||||||
|
"https://kubesec.io/basics/containers-securitycontext-capabilities-drop-index-all/",
|
||||||
|
"https://avd.aquasec.com/misconfig/ksv003"
|
||||||
|
],
|
||||||
|
"Status": "FAIL",
|
||||||
|
"Layer": {},
|
||||||
|
"IacMetadata": {
|
||||||
|
"Provider": "Kubernetes",
|
||||||
|
"Service": "general",
|
||||||
|
"StartLine": 121,
|
||||||
|
"EndLine": 133
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Namespace": "default",
|
||||||
|
"Kind": "ConfigMap",
|
||||||
|
"Name": "kube-root-ca.crt"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
17
docs/docs/kubernetes/operator/index.md
Normal file
17
docs/docs/kubernetes/operator/index.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Trivy Operator
|
||||||
|
|
||||||
|
Trivy has a native [Kubernetes Operator](operator) which continuously scans your Kubernetes cluster for security issues, and generates security reports as Kubernetes [Custom Resources](crd). It does it by watching Kubernetes for state changes and automatically triggering scans in response to changes, for example initiating a vulnerability scan when a new Pod is created.
|
||||||
|
|
||||||
|
|
||||||
|
> Kubernetes-native security toolkit. ([Documentation](https://aquasecurity.github.io/trivy-operator/latest)).
|
||||||
|
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<img src="./images/operator/trivy-operator-workloads.png" />
|
||||||
|
<figcaption>Workload reconcilers discover K8s controllers, manage scan jobs, and create VulnerabilityReport and ConfigAuditReport objects.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
[operator]: https://kubernetes.io/docs/concepts/extend-kubernetes/operator/
|
||||||
|
[crd]: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
|
||||||
|
[Starboard]: https://github.com/aquasecurity/starboard
|
||||||
|
[starboard-announcement]: https://github.com/aquasecurity/starboard/discussions/1173
|
||||||
24
docs/docs/misconfiguration/comparison/cfsec.md
Normal file
24
docs/docs/misconfiguration/comparison/cfsec.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# vs cfsec
|
||||||
|
[cfsec][cfsec] uses static analysis of your CloudFormation templates to spot potential security issues.
|
||||||
|
Trivy uses cfsec internally to scan both JSON and YAML configuration files, but Trivy doesn't support some features provided by cfsec.
|
||||||
|
This section describes the differences between Trivy and cfsec.
|
||||||
|
|
||||||
|
| Feature | Trivy | cfsec |
|
||||||
|
|-----------------------|--------------------------------------------------------|------------------------------|
|
||||||
|
| Built-in Policies | :material-check: | :material-check: |
|
||||||
|
| Custom Policies | :material-check: | :material-close: |
|
||||||
|
| Policy Metadata[^1] | :material-check: | :material-check: |
|
||||||
|
| Show Successes | :material-check: | :material-check: |
|
||||||
|
| Disable Policies | :material-check: | :material-check: |
|
||||||
|
| Show Issue Lines | :material-check: | :material-check: |
|
||||||
|
| View Statistics | :material-close: | :material-check: |
|
||||||
|
| Filtering by Severity | :material-check: | :material-close: |
|
||||||
|
| Supported Formats | Dockerfile, JSON, YAML, Terraform, CloudFormation etc. | CloudFormation JSON and YAML |
|
||||||
|
|
||||||
|
[^1]: To enrich the results such as ID, Title, Description, Severity, etc.
|
||||||
|
|
||||||
|
cfsec is designed for CloudFormation.
|
||||||
|
People who use only want to scan their CloudFormation templates should use cfsec.
|
||||||
|
People who want to scan a wide range of configuration files should use Trivy.
|
||||||
|
|
||||||
|
[cfsec]: https://github.com/aquasecurity/cfsec
|
||||||
43
docs/docs/misconfiguration/comparison/conftest.md
Normal file
43
docs/docs/misconfiguration/comparison/conftest.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# vs Conftest
|
||||||
|
[Conftest][conftest] is a really nice tool to help you write tests against structured configuration data.
|
||||||
|
Misconfiguration detection in Trivy is heavily inspired by Conftest and provides similar features Conftest has.
|
||||||
|
This section describes the differences between Trivy and Conftest.
|
||||||
|
|
||||||
|
| Feature | Trivy | Conftest |
|
||||||
|
| --------------------------- | -------------------- | -------------------- |
|
||||||
|
| Support Rego Language | :material-check: | :material-check: |
|
||||||
|
| Built-in Policies | :material-check: | :material-close: |
|
||||||
|
| Custom Policies | :material-check: | :material-check: |
|
||||||
|
| Custom Data | :material-check: | :material-check: |
|
||||||
|
| Combine | :material-check: | :material-check: |
|
||||||
|
| Combine per Policy | :material-check: | :material-close: |
|
||||||
|
| Policy Input Selector[^1] | :material-check: | :material-close: |
|
||||||
|
| Policy Metadata[^2] | :material-check: | :material-close:[^3] |
|
||||||
|
| Filtering by Severity | :material-check: | :material-close: |
|
||||||
|
| Rule-based Exceptions | :material-check: | :material-check: |
|
||||||
|
| Namespace-based Exceptions | :material-check: | :material-close: |
|
||||||
|
| Sharing Policies | :material-close: | :material-check: |
|
||||||
|
| Show Successes | :material-check: | :material-close: |
|
||||||
|
| Flexible Exit Code | :material-check: | :material-close: |
|
||||||
|
| Rego Unit Tests | :material-close:[^4] | :material-check: |
|
||||||
|
| Go Testing | :material-check: | :material-close: |
|
||||||
|
| Verbose Trace | :material-check: | :material-check: |
|
||||||
|
| Supported Formats | 6 formats[^5] | 14 formats[^6] |
|
||||||
|
|
||||||
|
Trivy offers built-in policies and a variety of options, while Conftest only supports custom policies.
|
||||||
|
In other words, Conftest is simpler and lighter.
|
||||||
|
|
||||||
|
Conftest is a general testing tool for configuration files, and Trivy is more security-focused.
|
||||||
|
People who need an out-of-the-box misconfiguration scanner should use Trivy.
|
||||||
|
People who don't need built-in policies and write your policies should use Conftest.
|
||||||
|
|
||||||
|
[^1]: Pass only the types of configuration file as input, specified in selector
|
||||||
|
[^2]: To enrich the results such as ID, Title, Description, etc.
|
||||||
|
[^3]: Conftest supports [structured errors in rules][conftest-structured], but they are free format and not natively supported by Conftest.
|
||||||
|
[^4]: Trivy is not able to run `*_test.rego` like `conftest verify`.
|
||||||
|
[^5]: Dockerfile, HCL, HCL2, JSON, TOML, and YAML
|
||||||
|
[^6]: CUE, Dockerfile, EDN, HCL, HCL2, HOCON, Ignore files, INI, JSON, Jsonnet, TOML, VCL, XML, and YAML
|
||||||
|
|
||||||
|
|
||||||
|
[conftest-structured]: https://github.com/open-policy-agent/conftest/pull/243
|
||||||
|
[conftest]: https://github.com/open-policy-agent/conftest
|
||||||
25
docs/docs/misconfiguration/comparison/tfsec.md
Normal file
25
docs/docs/misconfiguration/comparison/tfsec.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# vs tfsec
|
||||||
|
[tfsec][tfsec] uses static analysis of your Terraform templates to spot potential security issues.
|
||||||
|
Trivy uses tfsec internally to scan Terraform HCL files, but Trivy doesn't support some features provided by tfsec.
|
||||||
|
This section describes the differences between Trivy and tfsec.
|
||||||
|
|
||||||
|
| Feature | Trivy | tfsec |
|
||||||
|
|-----------------------|--------------------------------------------------------|----------------------|
|
||||||
|
| Built-in Policies | :material-check: | :material-check: |
|
||||||
|
| Custom Policies | Rego | Rego, JSON, and YAML |
|
||||||
|
| Policy Metadata[^1] | :material-check: | :material-check: |
|
||||||
|
| Show Successes | :material-check: | :material-check: |
|
||||||
|
| Disable Policies | :material-check: | :material-check: |
|
||||||
|
| Show Issue Lines | :material-check: | :material-check: |
|
||||||
|
| Support .tfvars | :material-close: | :material-check: |
|
||||||
|
| View Statistics | :material-close: | :material-check: |
|
||||||
|
| Filtering by Severity | :material-check: | :material-check: |
|
||||||
|
| Supported Formats | Dockerfile, JSON, YAML, Terraform, CloudFormation etc. | Terraform |
|
||||||
|
|
||||||
|
[^1]: To enrich the results such as ID, Title, Description, Severity, etc.
|
||||||
|
|
||||||
|
tfsec is designed for Terraform.
|
||||||
|
People who use only Terraform should use tfsec.
|
||||||
|
People who want to scan a wide range of configuration files should use Trivy.
|
||||||
|
|
||||||
|
[tfsec]: https://github.com/aquasecurity/tfsec
|
||||||
44
docs/docs/misconfiguration/custom/combine.md
Normal file
44
docs/docs/misconfiguration/custom/combine.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# Combined input
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Trivy usually scans each configuration file individually.
|
||||||
|
Sometimes it might be useful to compare values from different configuration files simultaneously.
|
||||||
|
|
||||||
|
When `combine` is set to true, all config files under the specified directory are combined into one input data structure.
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
```
|
||||||
|
__rego_input__ := {
|
||||||
|
"combine": false,
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In "combine" mode, the `input` document becomes an array, where each element is an object with two fields:
|
||||||
|
|
||||||
|
- `"path": "path/to/file"`: the relative file path of the respective file
|
||||||
|
- `"contents": ...`: the parsed content of the respective file
|
||||||
|
|
||||||
|
Now you can ensure that duplicate values match across the entirety of your configuration files.
|
||||||
|
|
||||||
|
## Return value
|
||||||
|
In "combine" mode, the `deny` entrypoint must return an object with two keys
|
||||||
|
|
||||||
|
`filepath` (required)
|
||||||
|
: the relative file path of the file being evaluated
|
||||||
|
|
||||||
|
`msg` (required)
|
||||||
|
: the message describing an issue
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
```
|
||||||
|
deny[res] {
|
||||||
|
resource := input[i].contents
|
||||||
|
... some logic ...
|
||||||
|
|
||||||
|
res := {
|
||||||
|
"filepath": input[i].path,
|
||||||
|
"msg": "something bad",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
35
docs/docs/misconfiguration/custom/data.md
Normal file
35
docs/docs/misconfiguration/custom/data.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Custom Data
|
||||||
|
|
||||||
|
Custom policies may require additional data in order to determine an answer.
|
||||||
|
|
||||||
|
For example, an allowed list of resources that can be created.
|
||||||
|
Instead of hardcoding this information inside of your policy, Trivy allows passing paths to data files with the `--data` flag.
|
||||||
|
|
||||||
|
Given the following yaml file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cd examples/misconf/custom-data
|
||||||
|
$ cat data/ports.yaml [~/src/github.com/aquasecurity/trivy/examples/misconf/custom-data]
|
||||||
|
services:
|
||||||
|
ports:
|
||||||
|
- "20"
|
||||||
|
- "20/tcp"
|
||||||
|
- "20/udp"
|
||||||
|
- "23"
|
||||||
|
- "23/tcp"
|
||||||
|
```
|
||||||
|
|
||||||
|
This can be imported into your policy:
|
||||||
|
|
||||||
|
```rego
|
||||||
|
import data.services
|
||||||
|
|
||||||
|
ports := services.ports
|
||||||
|
```
|
||||||
|
|
||||||
|
Then, you need to pass data paths through `--data` option.
|
||||||
|
Trivy recursively searches the specified paths for JSON (`*.json`) and YAML (`*.yaml`) files.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy conf --policy ./policy --data data --namespaces user ./configs
|
||||||
|
```
|
||||||
304
docs/docs/misconfiguration/custom/debug.md
Normal file
304
docs/docs/misconfiguration/custom/debug.md
Normal file
@@ -0,0 +1,304 @@
|
|||||||
|
# Debugging policies
|
||||||
|
When working on more complex queries (or when learning Rego), it's useful to see exactly how the policy is applied.
|
||||||
|
For this purpose you can use the `--trace` flag.
|
||||||
|
This will output a large trace from Open Policy Agent like the following:
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
Only failed policies show traces. If you want to debug a passed policy, you need to make it fail on purpose.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ trivy conf --trace configs/
|
||||||
|
2022-05-16T13:47:58.853+0100 INFO Detected config files: 1
|
||||||
|
|
||||||
|
Dockerfile (dockerfile)
|
||||||
|
=======================
|
||||||
|
Tests: 23 (SUCCESSES: 21, FAILURES: 2, EXCEPTIONS: 0)
|
||||||
|
Failures: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 1, CRITICAL: 0)
|
||||||
|
|
||||||
|
MEDIUM: Specify a tag in the 'FROM' statement for image 'alpine'
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
When using a 'FROM' statement you should use a specific tag to avoid uncontrolled behavior when the image is updated.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ds001
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Dockerfile:1
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
1 [ FROM alpine:latest
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
HIGH: Last USER command in Dockerfile should not be 'root'
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
Running containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ds002
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Dockerfile:3
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
3 [ USER root
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ID: DS001
|
||||||
|
File: Dockerfile
|
||||||
|
Namespace: builtin.dockerfile.DS001
|
||||||
|
Query: data.builtin.dockerfile.DS001.deny
|
||||||
|
Message: Specify a tag in the 'FROM' statement for image 'alpine'
|
||||||
|
TRACE Enter data.builtin.dockerfile.DS001.deny = _
|
||||||
|
TRACE | Eval data.builtin.dockerfile.DS001.deny = _
|
||||||
|
TRACE | Index data.builtin.dockerfile.DS001.deny (matched 1 rule)
|
||||||
|
TRACE | Enter data.builtin.dockerfile.DS001.deny
|
||||||
|
TRACE | | Eval output = data.builtin.dockerfile.DS001.fail_latest[_]
|
||||||
|
TRACE | | Index data.builtin.dockerfile.DS001.fail_latest (matched 1 rule)
|
||||||
|
TRACE | | Enter data.builtin.dockerfile.DS001.fail_latest
|
||||||
|
TRACE | | | Eval output = data.builtin.dockerfile.DS001.image_tags[_]
|
||||||
|
TRACE | | | Index data.builtin.dockerfile.DS001.image_tags (matched 2 rules)
|
||||||
|
TRACE | | | Enter data.builtin.dockerfile.DS001.image_tags
|
||||||
|
TRACE | | | | Eval from = data.lib.docker.from[_]
|
||||||
|
TRACE | | | | Index data.lib.docker.from (matched 1 rule)
|
||||||
|
TRACE | | | | Enter data.lib.docker.from
|
||||||
|
TRACE | | | | | Eval instruction = input.stages[_][_]
|
||||||
|
TRACE | | | | | Eval instruction.Cmd = "from"
|
||||||
|
TRACE | | | | | Exit data.lib.docker.from
|
||||||
|
TRACE | | | | Redo data.lib.docker.from
|
||||||
|
TRACE | | | | | Redo instruction.Cmd = "from"
|
||||||
|
TRACE | | | | | Redo instruction = input.stages[_][_]
|
||||||
|
TRACE | | | | | Eval instruction.Cmd = "from"
|
||||||
|
TRACE | | | | | Fail instruction.Cmd = "from"
|
||||||
|
TRACE | | | | | Redo instruction = input.stages[_][_]
|
||||||
|
TRACE | | | | | Eval instruction.Cmd = "from"
|
||||||
|
TRACE | | | | | Fail instruction.Cmd = "from"
|
||||||
|
TRACE | | | | | Redo instruction = input.stages[_][_]
|
||||||
|
TRACE | | | | Eval name = from.Value[0]
|
||||||
|
TRACE | | | | Eval not startswith(name, "$")
|
||||||
|
TRACE | | | | Enter startswith(name, "$")
|
||||||
|
TRACE | | | | | Eval startswith(name, "$")
|
||||||
|
TRACE | | | | | Fail startswith(name, "$")
|
||||||
|
TRACE | | | | Eval data.builtin.dockerfile.DS001.parse_tag(name, __local505__)
|
||||||
|
TRACE | | | | Index data.builtin.dockerfile.DS001.parse_tag (matched 2 rules)
|
||||||
|
TRACE | | | | Enter data.builtin.dockerfile.DS001.parse_tag
|
||||||
|
TRACE | | | | | Eval split(name, ":", __local504__)
|
||||||
|
TRACE | | | | | Eval [img, tag] = __local504__
|
||||||
|
TRACE | | | | | Exit data.builtin.dockerfile.DS001.parse_tag
|
||||||
|
TRACE | | | | Eval [img, tag] = __local505__
|
||||||
|
TRACE | | | | Eval output = {"cmd": from, "img": img, "tag": tag}
|
||||||
|
TRACE | | | | Exit data.builtin.dockerfile.DS001.image_tags
|
||||||
|
TRACE | | | Redo data.builtin.dockerfile.DS001.image_tags
|
||||||
|
TRACE | | | | Redo output = {"cmd": from, "img": img, "tag": tag}
|
||||||
|
TRACE | | | | Redo [img, tag] = __local505__
|
||||||
|
TRACE | | | | Redo data.builtin.dockerfile.DS001.parse_tag(name, __local505__)
|
||||||
|
TRACE | | | | Redo data.builtin.dockerfile.DS001.parse_tag
|
||||||
|
TRACE | | | | | Redo [img, tag] = __local504__
|
||||||
|
TRACE | | | | | Redo split(name, ":", __local504__)
|
||||||
|
TRACE | | | | Enter data.builtin.dockerfile.DS001.parse_tag
|
||||||
|
TRACE | | | | | Eval tag = "latest"
|
||||||
|
TRACE | | | | | Eval not contains(img, ":")
|
||||||
|
TRACE | | | | | Enter contains(img, ":")
|
||||||
|
TRACE | | | | | | Eval contains(img, ":")
|
||||||
|
TRACE | | | | | | Exit contains(img, ":")
|
||||||
|
TRACE | | | | | Redo contains(img, ":")
|
||||||
|
TRACE | | | | | | Redo contains(img, ":")
|
||||||
|
TRACE | | | | | Fail not contains(img, ":")
|
||||||
|
TRACE | | | | | Redo tag = "latest"
|
||||||
|
TRACE | | | | Redo name = from.Value[0]
|
||||||
|
TRACE | | | | Redo from = data.lib.docker.from[_]
|
||||||
|
TRACE | | | Enter data.builtin.dockerfile.DS001.image_tags
|
||||||
|
TRACE | | | | Eval from = data.lib.docker.from[i]
|
||||||
|
TRACE | | | | Index data.lib.docker.from (matched 1 rule)
|
||||||
|
TRACE | | | | Eval name = from.Value[0]
|
||||||
|
TRACE | | | | Eval cmd_obj = input.stages[j][k]
|
||||||
|
TRACE | | | | Eval possibilities = {"arg", "env"}
|
||||||
|
TRACE | | | | Eval cmd_obj.Cmd = possibilities[l]
|
||||||
|
TRACE | | | | Fail cmd_obj.Cmd = possibilities[l]
|
||||||
|
TRACE | | | | Redo possibilities = {"arg", "env"}
|
||||||
|
TRACE | | | | Redo cmd_obj = input.stages[j][k]
|
||||||
|
TRACE | | | | Eval possibilities = {"arg", "env"}
|
||||||
|
TRACE | | | | Eval cmd_obj.Cmd = possibilities[l]
|
||||||
|
TRACE | | | | Fail cmd_obj.Cmd = possibilities[l]
|
||||||
|
TRACE | | | | Redo possibilities = {"arg", "env"}
|
||||||
|
TRACE | | | | Redo cmd_obj = input.stages[j][k]
|
||||||
|
TRACE | | | | Eval possibilities = {"arg", "env"}
|
||||||
|
TRACE | | | | Eval cmd_obj.Cmd = possibilities[l]
|
||||||
|
TRACE | | | | Fail cmd_obj.Cmd = possibilities[l]
|
||||||
|
TRACE | | | | Redo possibilities = {"arg", "env"}
|
||||||
|
TRACE | | | | Redo cmd_obj = input.stages[j][k]
|
||||||
|
TRACE | | | | Redo name = from.Value[0]
|
||||||
|
TRACE | | | | Redo from = data.lib.docker.from[i]
|
||||||
|
TRACE | | | Eval __local752__ = output.img
|
||||||
|
TRACE | | | Eval neq(__local752__, "scratch")
|
||||||
|
TRACE | | | Eval __local753__ = output.img
|
||||||
|
TRACE | | | Eval not data.builtin.dockerfile.DS001.is_alias(__local753__)
|
||||||
|
TRACE | | | Enter data.builtin.dockerfile.DS001.is_alias(__local753__)
|
||||||
|
TRACE | | | | Eval data.builtin.dockerfile.DS001.is_alias(__local753__)
|
||||||
|
TRACE | | | | Index data.builtin.dockerfile.DS001.is_alias (matched 1 rule, early exit)
|
||||||
|
TRACE | | | | Enter data.builtin.dockerfile.DS001.is_alias
|
||||||
|
TRACE | | | | | Eval img = data.builtin.dockerfile.DS001.get_aliases[_]
|
||||||
|
TRACE | | | | | Index data.builtin.dockerfile.DS001.get_aliases (matched 1 rule)
|
||||||
|
TRACE | | | | | Enter data.builtin.dockerfile.DS001.get_aliases
|
||||||
|
TRACE | | | | | | Eval from_cmd = data.lib.docker.from[_]
|
||||||
|
TRACE | | | | | | Index data.lib.docker.from (matched 1 rule)
|
||||||
|
TRACE | | | | | | Eval __local749__ = from_cmd.Value
|
||||||
|
TRACE | | | | | | Eval data.builtin.dockerfile.DS001.get_alias(__local749__, __local503__)
|
||||||
|
TRACE | | | | | | Index data.builtin.dockerfile.DS001.get_alias (matched 1 rule)
|
||||||
|
TRACE | | | | | | Enter data.builtin.dockerfile.DS001.get_alias
|
||||||
|
TRACE | | | | | | | Eval __local748__ = values[i]
|
||||||
|
TRACE | | | | | | | Eval lower(__local748__, __local501__)
|
||||||
|
TRACE | | | | | | | Eval "as" = __local501__
|
||||||
|
TRACE | | | | | | | Fail "as" = __local501__
|
||||||
|
TRACE | | | | | | | Redo lower(__local748__, __local501__)
|
||||||
|
TRACE | | | | | | | Redo __local748__ = values[i]
|
||||||
|
TRACE | | | | | | Fail data.builtin.dockerfile.DS001.get_alias(__local749__, __local503__)
|
||||||
|
TRACE | | | | | | Redo __local749__ = from_cmd.Value
|
||||||
|
TRACE | | | | | | Redo from_cmd = data.lib.docker.from[_]
|
||||||
|
TRACE | | | | | Fail img = data.builtin.dockerfile.DS001.get_aliases[_]
|
||||||
|
TRACE | | | | Fail data.builtin.dockerfile.DS001.is_alias(__local753__)
|
||||||
|
TRACE | | | Eval output.tag = "latest"
|
||||||
|
TRACE | | | Exit data.builtin.dockerfile.DS001.fail_latest
|
||||||
|
TRACE | | Redo data.builtin.dockerfile.DS001.fail_latest
|
||||||
|
TRACE | | | Redo output.tag = "latest"
|
||||||
|
TRACE | | | Redo __local753__ = output.img
|
||||||
|
TRACE | | | Redo neq(__local752__, "scratch")
|
||||||
|
TRACE | | | Redo __local752__ = output.img
|
||||||
|
TRACE | | | Redo output = data.builtin.dockerfile.DS001.image_tags[_]
|
||||||
|
TRACE | | Eval __local754__ = output.img
|
||||||
|
TRACE | | Eval sprintf("Specify a tag in the 'FROM' statement for image '%s'", [__local754__], __local509__)
|
||||||
|
TRACE | | Eval msg = __local509__
|
||||||
|
TRACE | | Eval __local755__ = output.cmd
|
||||||
|
TRACE | | Eval data.lib.docker.result(msg, __local755__, __local510__)
|
||||||
|
TRACE | | Index data.lib.docker.result (matched 1 rule)
|
||||||
|
TRACE | | Enter data.lib.docker.result
|
||||||
|
TRACE | | | Eval object.get(cmd, "EndLine", 0, __local470__)
|
||||||
|
TRACE | | | Eval object.get(cmd, "Path", "", __local471__)
|
||||||
|
TRACE | | | Eval object.get(cmd, "StartLine", 0, __local472__)
|
||||||
|
TRACE | | | Eval result = {"endline": __local470__, "filepath": __local471__, "msg": msg, "startline": __local472__}
|
||||||
|
TRACE | | | Exit data.lib.docker.result
|
||||||
|
TRACE | | Eval res = __local510__
|
||||||
|
TRACE | | Exit data.builtin.dockerfile.DS001.deny
|
||||||
|
TRACE | Redo data.builtin.dockerfile.DS001.deny
|
||||||
|
TRACE | | Redo res = __local510__
|
||||||
|
TRACE | | Redo data.lib.docker.result(msg, __local755__, __local510__)
|
||||||
|
TRACE | | Redo data.lib.docker.result
|
||||||
|
TRACE | | | Redo result = {"endline": __local470__, "filepath": __local471__, "msg": msg, "startline": __local472__}
|
||||||
|
TRACE | | | Redo object.get(cmd, "StartLine", 0, __local472__)
|
||||||
|
TRACE | | | Redo object.get(cmd, "Path", "", __local471__)
|
||||||
|
TRACE | | | Redo object.get(cmd, "EndLine", 0, __local470__)
|
||||||
|
TRACE | | Redo __local755__ = output.cmd
|
||||||
|
TRACE | | Redo msg = __local509__
|
||||||
|
TRACE | | Redo sprintf("Specify a tag in the 'FROM' statement for image '%s'", [__local754__], __local509__)
|
||||||
|
TRACE | | Redo __local754__ = output.img
|
||||||
|
TRACE | | Redo output = data.builtin.dockerfile.DS001.fail_latest[_]
|
||||||
|
TRACE | Exit data.builtin.dockerfile.DS001.deny = _
|
||||||
|
TRACE Redo data.builtin.dockerfile.DS001.deny = _
|
||||||
|
TRACE | Redo data.builtin.dockerfile.DS001.deny = _
|
||||||
|
TRACE
|
||||||
|
|
||||||
|
|
||||||
|
ID: DS002
|
||||||
|
File: Dockerfile
|
||||||
|
Namespace: builtin.dockerfile.DS002
|
||||||
|
Query: data.builtin.dockerfile.DS002.deny
|
||||||
|
Message: Last USER command in Dockerfile should not be 'root'
|
||||||
|
TRACE Enter data.builtin.dockerfile.DS002.deny = _
|
||||||
|
TRACE | Eval data.builtin.dockerfile.DS002.deny = _
|
||||||
|
TRACE | Index data.builtin.dockerfile.DS002.deny (matched 2 rules)
|
||||||
|
TRACE | Enter data.builtin.dockerfile.DS002.deny
|
||||||
|
TRACE | | Eval data.builtin.dockerfile.DS002.fail_user_count
|
||||||
|
TRACE | | Index data.builtin.dockerfile.DS002.fail_user_count (matched 1 rule, early exit)
|
||||||
|
TRACE | | Enter data.builtin.dockerfile.DS002.fail_user_count
|
||||||
|
TRACE | | | Eval __local771__ = data.builtin.dockerfile.DS002.get_user
|
||||||
|
TRACE | | | Index data.builtin.dockerfile.DS002.get_user (matched 1 rule)
|
||||||
|
TRACE | | | Enter data.builtin.dockerfile.DS002.get_user
|
||||||
|
TRACE | | | | Eval user = data.lib.docker.user[_]
|
||||||
|
TRACE | | | | Index data.lib.docker.user (matched 1 rule)
|
||||||
|
TRACE | | | | Enter data.lib.docker.user
|
||||||
|
TRACE | | | | | Eval instruction = input.stages[_][_]
|
||||||
|
TRACE | | | | | Eval instruction.Cmd = "user"
|
||||||
|
TRACE | | | | | Fail instruction.Cmd = "user"
|
||||||
|
TRACE | | | | | Redo instruction = input.stages[_][_]
|
||||||
|
TRACE | | | | | Eval instruction.Cmd = "user"
|
||||||
|
TRACE | | | | | Exit data.lib.docker.user
|
||||||
|
TRACE | | | | Redo data.lib.docker.user
|
||||||
|
TRACE | | | | | Redo instruction.Cmd = "user"
|
||||||
|
TRACE | | | | | Redo instruction = input.stages[_][_]
|
||||||
|
TRACE | | | | | Eval instruction.Cmd = "user"
|
||||||
|
TRACE | | | | | Fail instruction.Cmd = "user"
|
||||||
|
TRACE | | | | | Redo instruction = input.stages[_][_]
|
||||||
|
TRACE | | | | Eval username = user.Value[_]
|
||||||
|
TRACE | | | | Exit data.builtin.dockerfile.DS002.get_user
|
||||||
|
TRACE | | | Redo data.builtin.dockerfile.DS002.get_user
|
||||||
|
TRACE | | | | Redo username = user.Value[_]
|
||||||
|
TRACE | | | | Redo user = data.lib.docker.user[_]
|
||||||
|
TRACE | | | Eval count(__local771__, __local536__)
|
||||||
|
TRACE | | | Eval lt(__local536__, 1)
|
||||||
|
TRACE | | | Fail lt(__local536__, 1)
|
||||||
|
TRACE | | | Redo count(__local771__, __local536__)
|
||||||
|
TRACE | | | Redo __local771__ = data.builtin.dockerfile.DS002.get_user
|
||||||
|
TRACE | | Fail data.builtin.dockerfile.DS002.fail_user_count
|
||||||
|
TRACE | Enter data.builtin.dockerfile.DS002.deny
|
||||||
|
TRACE | | Eval cmd = data.builtin.dockerfile.DS002.fail_last_user_root[_]
|
||||||
|
TRACE | | Index data.builtin.dockerfile.DS002.fail_last_user_root (matched 1 rule)
|
||||||
|
TRACE | | Enter data.builtin.dockerfile.DS002.fail_last_user_root
|
||||||
|
TRACE | | | Eval stage_users = data.lib.docker.stage_user[_]
|
||||||
|
TRACE | | | Index data.lib.docker.stage_user (matched 1 rule)
|
||||||
|
TRACE | | | Enter data.lib.docker.stage_user
|
||||||
|
TRACE | | | | Eval stage = input.stages[stage_name]
|
||||||
|
TRACE | | | | Eval users = [cmd | cmd = stage[_]; cmd.Cmd = "user"]
|
||||||
|
TRACE | | | | Enter cmd = stage[_]; cmd.Cmd = "user"
|
||||||
|
TRACE | | | | | Eval cmd = stage[_]
|
||||||
|
TRACE | | | | | Eval cmd.Cmd = "user"
|
||||||
|
TRACE | | | | | Fail cmd.Cmd = "user"
|
||||||
|
TRACE | | | | | Redo cmd = stage[_]
|
||||||
|
TRACE | | | | | Eval cmd.Cmd = "user"
|
||||||
|
TRACE | | | | | Exit cmd = stage[_]; cmd.Cmd = "user"
|
||||||
|
TRACE | | | | Redo cmd = stage[_]; cmd.Cmd = "user"
|
||||||
|
TRACE | | | | | Redo cmd.Cmd = "user"
|
||||||
|
TRACE | | | | | Redo cmd = stage[_]
|
||||||
|
TRACE | | | | | Eval cmd.Cmd = "user"
|
||||||
|
TRACE | | | | | Fail cmd.Cmd = "user"
|
||||||
|
TRACE | | | | | Redo cmd = stage[_]
|
||||||
|
TRACE | | | | Exit data.lib.docker.stage_user
|
||||||
|
TRACE | | | Redo data.lib.docker.stage_user
|
||||||
|
TRACE | | | | Redo users = [cmd | cmd = stage[_]; cmd.Cmd = "user"]
|
||||||
|
TRACE | | | | Redo stage = input.stages[stage_name]
|
||||||
|
TRACE | | | Eval count(stage_users, __local537__)
|
||||||
|
TRACE | | | Eval len = __local537__
|
||||||
|
TRACE | | | Eval minus(len, 1, __local538__)
|
||||||
|
TRACE | | | Eval last = stage_users[__local538__]
|
||||||
|
TRACE | | | Eval user = last.Value[0]
|
||||||
|
TRACE | | | Eval user = "root"
|
||||||
|
TRACE | | | Exit data.builtin.dockerfile.DS002.fail_last_user_root
|
||||||
|
TRACE | | Redo data.builtin.dockerfile.DS002.fail_last_user_root
|
||||||
|
TRACE | | | Redo user = "root"
|
||||||
|
TRACE | | | Redo user = last.Value[0]
|
||||||
|
TRACE | | | Redo last = stage_users[__local538__]
|
||||||
|
TRACE | | | Redo minus(len, 1, __local538__)
|
||||||
|
TRACE | | | Redo len = __local537__
|
||||||
|
TRACE | | | Redo count(stage_users, __local537__)
|
||||||
|
TRACE | | | Redo stage_users = data.lib.docker.stage_user[_]
|
||||||
|
TRACE | | Eval msg = "Last USER command in Dockerfile should not be 'root'"
|
||||||
|
TRACE | | Eval data.lib.docker.result(msg, cmd, __local540__)
|
||||||
|
TRACE | | Index data.lib.docker.result (matched 1 rule)
|
||||||
|
TRACE | | Enter data.lib.docker.result
|
||||||
|
TRACE | | | Eval object.get(cmd, "EndLine", 0, __local470__)
|
||||||
|
TRACE | | | Eval object.get(cmd, "Path", "", __local471__)
|
||||||
|
TRACE | | | Eval object.get(cmd, "StartLine", 0, __local472__)
|
||||||
|
TRACE | | | Eval result = {"endline": __local470__, "filepath": __local471__, "msg": msg, "startline": __local472__}
|
||||||
|
TRACE | | | Exit data.lib.docker.result
|
||||||
|
TRACE | | Eval res = __local540__
|
||||||
|
TRACE | | Exit data.builtin.dockerfile.DS002.deny
|
||||||
|
TRACE | Redo data.builtin.dockerfile.DS002.deny
|
||||||
|
TRACE | | Redo res = __local540__
|
||||||
|
TRACE | | Redo data.lib.docker.result(msg, cmd, __local540__)
|
||||||
|
TRACE | | Redo data.lib.docker.result
|
||||||
|
TRACE | | | Redo result = {"endline": __local470__, "filepath": __local471__, "msg": msg, "startline": __local472__}
|
||||||
|
TRACE | | | Redo object.get(cmd, "StartLine", 0, __local472__)
|
||||||
|
TRACE | | | Redo object.get(cmd, "Path", "", __local471__)
|
||||||
|
TRACE | | | Redo object.get(cmd, "EndLine", 0, __local470__)
|
||||||
|
TRACE | | Redo msg = "Last USER command in Dockerfile should not be 'root'"
|
||||||
|
TRACE | | Redo cmd = data.builtin.dockerfile.DS002.fail_last_user_root[_]
|
||||||
|
TRACE | Exit data.builtin.dockerfile.DS002.deny = _
|
||||||
|
TRACE Redo data.builtin.dockerfile.DS002.deny = _
|
||||||
|
TRACE | Redo data.builtin.dockerfile.DS002.deny = _
|
||||||
|
TRACE
|
||||||
|
```
|
||||||
296
docs/docs/misconfiguration/custom/examples.md
Normal file
296
docs/docs/misconfiguration/custom/examples.md
Normal file
@@ -0,0 +1,296 @@
|
|||||||
|
# Examples
|
||||||
|
|
||||||
|
## Custom Policy
|
||||||
|
### Kubernetes
|
||||||
|
See [here][k8s].
|
||||||
|
|
||||||
|
The custom policy is defined in `user.kubernetes.ID001` package.
|
||||||
|
You need to pass the package prefix you want to evaluate through `--namespaces` option.
|
||||||
|
In this case, the package prefix should be `user`, `user.kubernetes`, or `user.kubernetes.ID001`.
|
||||||
|
|
||||||
|
### Dockerfile
|
||||||
|
See [here][dockerfile].
|
||||||
|
|
||||||
|
The input will be a dictionary of stages.
|
||||||
|
|
||||||
|
#### Single Stage
|
||||||
|
|
||||||
|
??? example
|
||||||
|
Dockerfile
|
||||||
|
```dockerfile
|
||||||
|
FROM foo
|
||||||
|
COPY . /
|
||||||
|
RUN echo hello
|
||||||
|
```
|
||||||
|
|
||||||
|
Rego Input
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stages": {
|
||||||
|
"foo": [
|
||||||
|
{
|
||||||
|
"Cmd": "from",
|
||||||
|
"EndLine": 1,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "FROM foo",
|
||||||
|
"Stage": 0,
|
||||||
|
"StartLine": 1,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"foo"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "copy",
|
||||||
|
"EndLine": 2,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "COPY . /",
|
||||||
|
"Stage": 0,
|
||||||
|
"StartLine": 2,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
".",
|
||||||
|
"/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "run",
|
||||||
|
"EndLine": 3,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "RUN echo hello",
|
||||||
|
"Stage": 0,
|
||||||
|
"StartLine": 3,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"echo hello"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Multi Stage
|
||||||
|
|
||||||
|
??? example
|
||||||
|
Dockerfile
|
||||||
|
```dockerfile
|
||||||
|
FROM golang:1.16 AS builder
|
||||||
|
WORKDIR /go/src/github.com/alexellis/href-counter/
|
||||||
|
RUN go get -d -v golang.org/x/net/html
|
||||||
|
COPY app.go .
|
||||||
|
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
|
||||||
|
|
||||||
|
FROM alpine:latest
|
||||||
|
RUN apk --no-cache add ca-certificates \
|
||||||
|
&& apk add --no-cache bash
|
||||||
|
WORKDIR /root/
|
||||||
|
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
|
||||||
|
CMD ["./app"]
|
||||||
|
```
|
||||||
|
|
||||||
|
Rego Input
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"stages": {
|
||||||
|
"alpine:latest": [
|
||||||
|
{
|
||||||
|
"Cmd": "from",
|
||||||
|
"EndLine": 7,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "FROM alpine:latest",
|
||||||
|
"Stage": 1,
|
||||||
|
"StartLine": 7,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"alpine:latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "run",
|
||||||
|
"EndLine": 9,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "RUN apk --no-cache add ca-certificates \u0026\u0026 apk add --no-cache bash",
|
||||||
|
"Stage": 1,
|
||||||
|
"StartLine": 8,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"apk --no-cache add ca-certificates \u0026\u0026 apk add --no-cache bash"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "workdir",
|
||||||
|
"EndLine": 10,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "WORKDIR /root/",
|
||||||
|
"Stage": 1,
|
||||||
|
"StartLine": 10,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"/root/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "copy",
|
||||||
|
"EndLine": 11,
|
||||||
|
"Flags": [
|
||||||
|
"--from=builder"
|
||||||
|
],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "COPY --from=builder /go/src/github.com/alexellis/href-counter/app .",
|
||||||
|
"Stage": 1,
|
||||||
|
"StartLine": 11,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"/go/src/github.com/alexellis/href-counter/app",
|
||||||
|
"."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "cmd",
|
||||||
|
"EndLine": 12,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": true,
|
||||||
|
"Original": "CMD [\"./app\"]",
|
||||||
|
"Stage": 1,
|
||||||
|
"StartLine": 12,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"./app"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"golang:1.16 AS builder": [
|
||||||
|
{
|
||||||
|
"Cmd": "from",
|
||||||
|
"EndLine": 1,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "FROM golang:1.16 AS builder",
|
||||||
|
"Stage": 0,
|
||||||
|
"StartLine": 1,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"golang:1.16",
|
||||||
|
"AS",
|
||||||
|
"builder"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "workdir",
|
||||||
|
"EndLine": 2,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "WORKDIR /go/src/github.com/alexellis/href-counter/",
|
||||||
|
"Stage": 0,
|
||||||
|
"StartLine": 2,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"/go/src/github.com/alexellis/href-counter/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "run",
|
||||||
|
"EndLine": 3,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "RUN go get -d -v golang.org/x/net/html",
|
||||||
|
"Stage": 0,
|
||||||
|
"StartLine": 3,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"go get -d -v golang.org/x/net/html"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "copy",
|
||||||
|
"EndLine": 4,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "COPY app.go .",
|
||||||
|
"Stage": 0,
|
||||||
|
"StartLine": 4,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"app.go",
|
||||||
|
"."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Cmd": "run",
|
||||||
|
"EndLine": 5,
|
||||||
|
"Flags": [],
|
||||||
|
"JSON": false,
|
||||||
|
"Original": "RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .",
|
||||||
|
"Stage": 0,
|
||||||
|
"StartLine": 5,
|
||||||
|
"SubCmd": "",
|
||||||
|
"Value": [
|
||||||
|
"CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app ."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker Compose
|
||||||
|
See [here][compose].
|
||||||
|
|
||||||
|
Docker Compose uses YAML format for configurations. You can apply your Rego policies to `docker-compose.yml`.
|
||||||
|
|
||||||
|
### HCL
|
||||||
|
See [here][hcl].
|
||||||
|
|
||||||
|
Trivy parses HCL files and converts into structured data.
|
||||||
|
|
||||||
|
!!! warning
|
||||||
|
Terraform HCL files are not supported yet.
|
||||||
|
|
||||||
|
### Terraform Plan
|
||||||
|
See [here][tfplan].
|
||||||
|
|
||||||
|
Use the command [terraform show][terraform-show] to convert the Terraform plan into JSON so that OPA can read the plan.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ terraform init
|
||||||
|
$ terraform plan --out tfplan.binary
|
||||||
|
$ terraform show -json tfplan.binary > tfplan.json
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see also [OPA document][opa-terraform].
|
||||||
|
|
||||||
|
### Serverless Framework
|
||||||
|
See [here][serverless].
|
||||||
|
|
||||||
|
Server Framework uses YAML format for configurations. You can apply your Rego policies to `serverless.yaml`.
|
||||||
|
|
||||||
|
## Custom Data
|
||||||
|
See [here][data].
|
||||||
|
|
||||||
|
## Combined Input
|
||||||
|
See [here][combine].
|
||||||
|
|
||||||
|
## Go Testing
|
||||||
|
See [here][go-testing].
|
||||||
|
|
||||||
|
[k8s]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/kubernetes/
|
||||||
|
[dockerfile]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/dockerfile/
|
||||||
|
[compose]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/docker-compose/
|
||||||
|
[hcl]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/hcl/
|
||||||
|
[serverless]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/serverless/
|
||||||
|
[tfplan]:https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy/terraform-plan/
|
||||||
|
[terraform-show]: https://www.terraform.io/docs/cli/commands/show.html
|
||||||
|
[opa-terraform]: https://www.openpolicyagent.org/docs/latest/terraform/
|
||||||
|
|
||||||
|
[custom]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-policy
|
||||||
|
[data]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/custom-data
|
||||||
|
[combine]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/combine
|
||||||
|
[go-testing]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/go-testing
|
||||||
|
|
||||||
190
docs/docs/misconfiguration/custom/index.md
Normal file
190
docs/docs/misconfiguration/custom/index.md
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
# Custom Policies
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
You can write custom policies in [Rego][rego].
|
||||||
|
Once you finish writing custom policies, you can pass the directory where those policies are stored with `--policy` option.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
trivy conf --policy /path/to/custom_policies --namespaces user /path/to/config_dir
|
||||||
|
```
|
||||||
|
|
||||||
|
As for `--namespaces` option, the detail is described as below.
|
||||||
|
|
||||||
|
### File formats
|
||||||
|
If a file name matches the following file patterns, Trivy will parse the file and pass it as input to your Rego policy.
|
||||||
|
|
||||||
|
| File format | File pattern |
|
||||||
|
|---------------|-----------------------------------------------------------|
|
||||||
|
| JSON | `*.json` |
|
||||||
|
| YAML | `*.yaml` and `*.yml` |
|
||||||
|
| Dockerfile | `Dockerfile`, `Dockerfile.*`, and `*.Dockerfile` |
|
||||||
|
| Containerfile | `Containerfile`, `Containerfile.*`, and `*.Containerfile` |
|
||||||
|
| Terraform | `*.tf` and `*.tf.json` |
|
||||||
|
|
||||||
|
### Configuration languages
|
||||||
|
In the above general file formats, Trivy automatically identifies the following types of configuration files:
|
||||||
|
|
||||||
|
- CloudFormation (JSON/YAML)
|
||||||
|
- Kubernetes (JSON/YAML)
|
||||||
|
- Helm (YAML)
|
||||||
|
- Terraform Plan (JSON)
|
||||||
|
|
||||||
|
This is useful for filtering inputs, as described below.
|
||||||
|
|
||||||
|
## Rego format
|
||||||
|
A single package must contain only one policy.
|
||||||
|
|
||||||
|
!!!example
|
||||||
|
``` rego
|
||||||
|
package user.kubernetes.ID001
|
||||||
|
|
||||||
|
import lib.result
|
||||||
|
|
||||||
|
__rego_metadata__ := {
|
||||||
|
"id": "ID001",
|
||||||
|
"title": "Deployment not allowed",
|
||||||
|
"severity": "LOW",
|
||||||
|
"description": "Deployments are not allowed because of some reasons.",
|
||||||
|
}
|
||||||
|
|
||||||
|
__rego_input__ := {
|
||||||
|
"selector": [
|
||||||
|
{"type": "kubernetes"},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
deny[res] {
|
||||||
|
input.kind == "Deployment"
|
||||||
|
msg := sprintf("Found deployment '%s' but deployments are not allowed", [input.metadata.name])
|
||||||
|
res := result.new(msg, input)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
In this example, ID001 "Deployment not allowed" is defined under `user.kubernetes.ID001`.
|
||||||
|
If you add a new custom policy, it must be defined under a new package like `user.kubernetes.ID002`.
|
||||||
|
|
||||||
|
### Policy structure
|
||||||
|
|
||||||
|
`package` (required)
|
||||||
|
: - MUST follow the Rego's [specification][package]
|
||||||
|
- MUST be unique per policy
|
||||||
|
- SHOULD include policy id for uniqueness
|
||||||
|
- MAY include the group name such as `kubernetes` for clarity
|
||||||
|
- Group name has no effect on policy evaluation
|
||||||
|
|
||||||
|
`import data.lib.result` (optional)
|
||||||
|
: - MAY be defined if you would like to embellish your result(s) with line numbers and code highlighting
|
||||||
|
|
||||||
|
`__rego_metadata__` (optional)
|
||||||
|
: - SHOULD be defined for clarity since these values will be displayed in the scan results
|
||||||
|
|
||||||
|
`__rego_input__` (optional)
|
||||||
|
: - MAY be defined when you want to specify input format
|
||||||
|
|
||||||
|
`deny` (required)
|
||||||
|
: - SHOULD be `deny` or start with `deny_`
|
||||||
|
- Although `warn`, `warn_*`, `violation`, `violation_` also work for compatibility, `deny` is recommended as severity can be defined in `__rego_metadata__`.
|
||||||
|
- SHOULD return ONE OF:
|
||||||
|
- The result of a call to `result.new(msg, cause)`. The `msg` is a `string` describing the issue occurrence, and the `cause` is the property/object where the issue occurred. Providing this allows Trivy to ascertain line numbers and highlight code in the output.
|
||||||
|
- A `string` denoting the detected issue
|
||||||
|
- Although `object` with `msg` field is accepted, other fields are dropped and `string` is recommended if `result.new()` is not utilised.
|
||||||
|
- e.g. `{"msg": "deny message", "details": "something"}`
|
||||||
|
|
||||||
|
|
||||||
|
### Package
|
||||||
|
A package name must be unique per policy.
|
||||||
|
|
||||||
|
!!!example
|
||||||
|
``` rego
|
||||||
|
package user.kubernetes.ID001
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, only `builtin.*` packages will be evaluated.
|
||||||
|
If you define custom packages, you have to specify the package prefix via `--namespaces` option.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
trivy conf --policy /path/to/custom_policies --namespaces user /path/to/config_dir
|
||||||
|
```
|
||||||
|
|
||||||
|
In this case, `user.*` will be evaluated.
|
||||||
|
Any package prefixes such as `main` and `user` are allowed.
|
||||||
|
|
||||||
|
### Metadata
|
||||||
|
Metadata helps enrich Trivy's scan results with useful information.
|
||||||
|
|
||||||
|
!!!example
|
||||||
|
``` rego
|
||||||
|
__rego_metadata__ := {
|
||||||
|
"id": "ID001",
|
||||||
|
"title": "Deployment not allowed",
|
||||||
|
"severity": "LOW",
|
||||||
|
"description": "Deployments are not allowed because of some reasons.",
|
||||||
|
"recommended_actions": "Remove Deployment",
|
||||||
|
"url": "https://cloud.google.com/blog/products/containers-kubernetes/kubernetes-best-practices-resource-requests-and-limits",
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
All fields under `__rego_metadata__` are optional.
|
||||||
|
|
||||||
|
| Field name | Allowed values | Default value | In table | In JSON |
|
||||||
|
|---------------------|-------------------------------------|:-------------:|:----------------:|:----------------:|
|
||||||
|
| id | Any characters | N/A | :material-check: | :material-check: |
|
||||||
|
| title | Any characters | N/A | :material-check: | :material-check: |
|
||||||
|
| severity | `LOW`, `MEDIUM`, `HIGH`, `CRITICAL` | UNKNOWN | :material-check: | :material-check: |
|
||||||
|
| description | Any characters | | :material-close: | :material-check: |
|
||||||
|
| recommended_actions | Any characters | | :material-close: | :material-check: |
|
||||||
|
| url | Any characters | | :material-close: | :material-check: |
|
||||||
|
|
||||||
|
Some fields are displayed in scan results.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
k.yaml (kubernetes)
|
||||||
|
───────────────────
|
||||||
|
|
||||||
|
Tests: 32 (SUCCESSES: 31, FAILURES: 1, EXCEPTIONS: 0)
|
||||||
|
Failures: 1 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
|
||||||
|
|
||||||
|
LOW: Found deployment 'my-deployment' but deployments are not allowed
|
||||||
|
════════════════════════════════════════════════════════════════════════
|
||||||
|
Deployments are not allowed because of some reasons.
|
||||||
|
────────────────────────────────────────────────────────────────────────
|
||||||
|
k.yaml:1-2
|
||||||
|
────────────────────────────────────────────────────────────────────────
|
||||||
|
1 ┌ apiVersion: v1
|
||||||
|
2 └ kind: Deployment
|
||||||
|
────────────────────────────────────────────────────────────────────────
|
||||||
|
```
|
||||||
|
|
||||||
|
### Input
|
||||||
|
You can specify input format via `__rego_input__`.
|
||||||
|
All fields under `__rego_input` are optional.
|
||||||
|
|
||||||
|
!!!example
|
||||||
|
``` rego
|
||||||
|
__rego_input__ := {
|
||||||
|
"combine": false,
|
||||||
|
"selector": [
|
||||||
|
{"type": "kubernetes"},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`combine` (boolean)
|
||||||
|
: The details are [here](combine.md).
|
||||||
|
|
||||||
|
`selector` (array)
|
||||||
|
: This option filters the input by file format or configuration language.
|
||||||
|
In the above example, Trivy passes only Kubernetes files to this policy.
|
||||||
|
Even if a Dockerfile exists in the specified directory, it will not be passed to the policy as input.
|
||||||
|
|
||||||
|
When configuration languages such as Kubernetes are not identified, file formats such as JSON will be used as `type`.
|
||||||
|
When a configuration language is identified, it will overwrite `type`.
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
`pod.yaml` including Kubernetes Pod will be handled as `kubernetes`, not `yaml`.
|
||||||
|
`type` is overwritten by `kubernetes` from `yaml`.
|
||||||
|
|
||||||
|
`type` accepts `kubernetes`, `dockerfile`, `cloudformation`, `terraform`, `terraformplan`, `json`, or `yaml`.
|
||||||
|
|
||||||
|
[rego]: https://www.openpolicyagent.org/docs/latest/policy-language/
|
||||||
|
[package]: https://www.openpolicyagent.org/docs/latest/policy-language/#packages
|
||||||
90
docs/docs/misconfiguration/custom/testing.md
Normal file
90
docs/docs/misconfiguration/custom/testing.md
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# Testing
|
||||||
|
It is highly recommended to write tests for your custom policies.
|
||||||
|
|
||||||
|
## Rego testing
|
||||||
|
To help you verify the correctness of your custom policies, OPA gives you a framework that you can use to write tests for your policies.
|
||||||
|
By writing tests for your custom policies you can speed up the development process of new rules and reduce the amount of time it takes to modify rules as requirements evolve.
|
||||||
|
|
||||||
|
For more details, see [Policy Testing][opa-testing].
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
```
|
||||||
|
package user.dockerfile.ID002
|
||||||
|
|
||||||
|
test_add_denied {
|
||||||
|
r := deny with input as {"stages": {"alpine:3.13": [
|
||||||
|
{"Cmd": "add", "Value": ["/target/resources.tar.gz", "resources.jar"]},
|
||||||
|
{"Cmd": "add", "Value": ["/target/app.jar", "app.jar"]},
|
||||||
|
]}}
|
||||||
|
|
||||||
|
count(r) == 1
|
||||||
|
r[_] == "Consider using 'COPY /target/app.jar app.jar' command instead of 'ADD /target/app.jar app.jar'"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To write tests for custom policies, you can refer to existing tests under [defsec][defsec].
|
||||||
|
|
||||||
|
## Go testing
|
||||||
|
[Fanal][fanal] which is a core library of Trivy can be imported as a Go library.
|
||||||
|
You can scan config files in Go and test your custom policies using Go's testing methods, such as [table-driven tests][table].
|
||||||
|
This allows you to use the actual configuration file as input, making it easy to prepare test data and ensure that your custom policies work in practice.
|
||||||
|
|
||||||
|
In particular, Dockerfile and HCL need to be converted to structural data as input, which may be different from the expected input format.
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
We recommend writing OPA and Go tests both since they have different roles, like unit tests and integration tests.
|
||||||
|
|
||||||
|
The following example stores allowed and denied configuration files in a directory.
|
||||||
|
`Successes` contains the result of successes, and `Failures` contains the result of failures.
|
||||||
|
|
||||||
|
``` go
|
||||||
|
{
|
||||||
|
name: "disallowed ports",
|
||||||
|
input: "configs/",
|
||||||
|
fields: fields{
|
||||||
|
policyPaths: []string{"policy"},
|
||||||
|
dataPaths: []string{"data"},
|
||||||
|
namespaces: []string{"user"},
|
||||||
|
},
|
||||||
|
want: []types.Misconfiguration{
|
||||||
|
{
|
||||||
|
FileType: types.Dockerfile,
|
||||||
|
FilePath: "Dockerfile.allowed",
|
||||||
|
Successes: types.MisconfResults{
|
||||||
|
{
|
||||||
|
Namespace: "user.dockerfile.ID002",
|
||||||
|
PolicyMetadata: types.PolicyMetadata{
|
||||||
|
ID: "ID002",
|
||||||
|
Type: "Docker Custom Check",
|
||||||
|
Title: "Disallowed ports exposed",
|
||||||
|
Severity: "HIGH",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
FileType: types.Dockerfile,
|
||||||
|
FilePath: "Dockerfile.denied",
|
||||||
|
Failures: types.MisconfResults{
|
||||||
|
{
|
||||||
|
Namespace: "user.dockerfile.ID002",
|
||||||
|
Message: "Port 23 should not be exposed",
|
||||||
|
PolicyMetadata: types.PolicyMetadata{
|
||||||
|
ID: "ID002",
|
||||||
|
Type: "Docker Custom Check",
|
||||||
|
Title: "Disallowed ports exposed",
|
||||||
|
Severity: "HIGH",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
`Dockerfile.allowed` has one successful result in `Successes`, while `Dockerfile.denied` has one failure result in `Failures`.
|
||||||
|
|
||||||
|
[opa-testing]: https://www.openpolicyagent.org/docs/latest/policy-testing/
|
||||||
|
[defsec]: https://github.com/aquasecurity/defsec
|
||||||
|
[table]: https://github.com/golang/go/wiki/TableDrivenTests
|
||||||
|
[fanal]: https://github.com/aquasecurity/fanal
|
||||||
60
docs/docs/misconfiguration/options/filter.md
Normal file
60
docs/docs/misconfiguration/options/filter.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# Filter Misconfigurations
|
||||||
|
|
||||||
|
## By Severity
|
||||||
|
|
||||||
|
Use `--severity` option.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
trivy conf --severity HIGH,CRITICAL examples/misconf/mixed
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```shell
|
||||||
|
2022-05-16T13:50:42.718+0100 INFO Detected config files: 3
|
||||||
|
|
||||||
|
Dockerfile (dockerfile)
|
||||||
|
=======================
|
||||||
|
Tests: 17 (SUCCESSES: 16, FAILURES: 1, EXCEPTIONS: 0)
|
||||||
|
Failures: 1 (HIGH: 1, CRITICAL: 0)
|
||||||
|
|
||||||
|
HIGH: Last USER command in Dockerfile should not be 'root'
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
Running containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ds002
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Dockerfile:3
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
3 [ USER root
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
deployment.yaml (kubernetes)
|
||||||
|
============================
|
||||||
|
Tests: 8 (SUCCESSES: 8, FAILURES: 0, EXCEPTIONS: 0)
|
||||||
|
Failures: 0 (HIGH: 0, CRITICAL: 0)
|
||||||
|
|
||||||
|
|
||||||
|
main.tf (terraform)
|
||||||
|
===================
|
||||||
|
Tests: 1 (SUCCESSES: 0, FAILURES: 1, EXCEPTIONS: 0)
|
||||||
|
Failures: 1 (HIGH: 0, CRITICAL: 1)
|
||||||
|
|
||||||
|
CRITICAL: Classic resources should not be used.
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
AWS Classic resources run in a shared environment with infrastructure owned by other AWS customers. You should run
|
||||||
|
resources in a VPC instead.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/avd-aws-0081
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
main.tf:2-4
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
2 ┌ resource "aws_db_security_group" "sg" {
|
||||||
|
3 │
|
||||||
|
4 └ }
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
```
|
||||||
|
</details>
|
||||||
22
docs/docs/misconfiguration/options/others.md
Normal file
22
docs/docs/misconfiguration/options/others.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Others
|
||||||
|
|
||||||
|
!!! hint
|
||||||
|
See also [Others](../../vulnerability/examples/others.md) in Vulnerability section.
|
||||||
|
|
||||||
|
## File patterns
|
||||||
|
When a directory is given as an input, Trivy will recursively look for and test all files based on file patterns.
|
||||||
|
The default file patterns are [here](../custom/index.md).
|
||||||
|
|
||||||
|
In addition to the default file patterns, the `--file-patterns` option takes regexp patterns to look for your files.
|
||||||
|
For example, it may be useful when your file name of Dockerfile doesn't match the default patterns.
|
||||||
|
|
||||||
|
This can be repeated for specifying multiple file patterns.
|
||||||
|
Allowed values are here:
|
||||||
|
|
||||||
|
- dockerfile
|
||||||
|
- yaml
|
||||||
|
- json
|
||||||
|
- toml
|
||||||
|
- hcl
|
||||||
|
|
||||||
|
For more details, see [an example](https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/file-patterns)
|
||||||
35
docs/docs/misconfiguration/options/policy.md
Normal file
35
docs/docs/misconfiguration/options/policy.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Policy
|
||||||
|
|
||||||
|
## Pass custom policies
|
||||||
|
You can pass directories including your custom policies through `--policy` option.
|
||||||
|
This can be repeated for specifying multiple directories.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd examplex/misconf/
|
||||||
|
trivy conf --policy custom-policy/policy --policy combine/policy --namespaces user misconf/mixed
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see [Custom Policies](../custom/index.md).
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
You also need to specify `--namespaces` option.
|
||||||
|
|
||||||
|
## Pass custom data
|
||||||
|
You can pass directories including your custom data through `--data` option.
|
||||||
|
This can be repeated for specifying multiple directories.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd examples/misconf/custom-data
|
||||||
|
trivy conf --policy ./policy --data ./data --namespaces user ./configs
|
||||||
|
```
|
||||||
|
|
||||||
|
For more details, see [Custom Data](../custom/data.md).
|
||||||
|
|
||||||
|
## Pass namespaces
|
||||||
|
By default, Trivy evaluates policies defined in `builtin.*`.
|
||||||
|
If you want to evaluate custom policies in other packages, you have to specify package prefixes through `--namespaces` option.
|
||||||
|
This can be repeated for specifying multiple packages.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
trivy conf --policy ./policy --namespaces main --namespaces user ./configs
|
||||||
|
```
|
||||||
6
docs/docs/misconfiguration/options/report.md
Normal file
6
docs/docs/misconfiguration/options/report.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Report Formats
|
||||||
|
|
||||||
|
See [Reports Formats](../../vulnerability/examples/report.md) in Vulnerability section.
|
||||||
|
|
||||||
|
!!! caution
|
||||||
|
Misconfiguration scanning doesn't support default templates such as XML for now.
|
||||||
27
docs/docs/misconfiguration/policy/builtin.md
Normal file
27
docs/docs/misconfiguration/policy/builtin.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Built-in Policies
|
||||||
|
|
||||||
|
## Policy Sources
|
||||||
|
|
||||||
|
Built-in policies are mainly written in [Rego][rego] and Go.
|
||||||
|
Those policies are managed under [defsec repository][defsec].
|
||||||
|
|
||||||
|
| Config type | Source |
|
||||||
|
|---------------------------|----------------------|
|
||||||
|
| Kubernetes | [defsec][kubernetes] |
|
||||||
|
| Dockerfile, Containerfile | [defsec][docker] |
|
||||||
|
| Terraform | [defsec][defsec] |
|
||||||
|
| CloudFormation | [defsec][defsec] |
|
||||||
|
| Helm Chart | [defsec][kubernetes] |
|
||||||
|
| RBAC | [defsec][rbac] |
|
||||||
|
|
||||||
|
For suggestions or issues regarding policy content, please open an issue under the [defsec][defsec] repository.
|
||||||
|
|
||||||
|
Helm Chart scanning will resolve the chart to Kubernetes manifests then run the [kubernetes][kubernetes] checks.
|
||||||
|
|
||||||
|
Ansible scanning is coming soon.
|
||||||
|
|
||||||
|
[rego]: https://www.openpolicyagent.org/docs/latest/policy-language/
|
||||||
|
[defsec]: https://github.com/aquasecurity/defsec
|
||||||
|
[kubernetes]: https://github.com/aquasecurity/defsec/tree/master/internal/rules/kubernetes
|
||||||
|
[kubernetes]: https://github.com/aquasecurity/defsec/tree/master/internal/rules/rbac
|
||||||
|
[docker]: https://github.com/aquasecurity/defsec/tree/master/internal/rules/docker
|
||||||
98
docs/docs/misconfiguration/policy/exceptions.md
Normal file
98
docs/docs/misconfiguration/policy/exceptions.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# Exceptions
|
||||||
|
Exceptions let you specify cases where you allow policy violations.
|
||||||
|
Trivy supports two types of exceptions.
|
||||||
|
|
||||||
|
!!! info
|
||||||
|
Exceptions can be applied to built-in policies as well as custom policies.
|
||||||
|
|
||||||
|
## Namespace-based exceptions
|
||||||
|
There are some cases where you need to disable built-in policies partially or fully.
|
||||||
|
Namespace-based exceptions lets you rough choose which individual packages to exempt.
|
||||||
|
|
||||||
|
To use namespace-based exceptions, create a Rego rule with the name `exception` that returns the package names to exempt.
|
||||||
|
The `exception` rule must be defined under `namespace.exceptions`.
|
||||||
|
`data.namespaces` includes all package names.
|
||||||
|
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
``` rego
|
||||||
|
package namespace.exceptions
|
||||||
|
|
||||||
|
import data.namespaces
|
||||||
|
|
||||||
|
exception[ns] {
|
||||||
|
ns := data.namespaces[_]
|
||||||
|
startswith(ns, "builtin.kubernetes")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This example exempts all built-in policies for Kubernetes.
|
||||||
|
|
||||||
|
For more details, see [an example][ns-example].
|
||||||
|
|
||||||
|
## Rule-based exceptions
|
||||||
|
There are some cases where you need more flexibility and granularity in defining which cases to exempt.
|
||||||
|
Rule-based exceptions lets you granularly choose which individual rules to exempt, while also declaring under which conditions to exempt them.
|
||||||
|
|
||||||
|
To use rule-based exceptions, create a Rego rule with the name `exception` that returns the rule name suffixes to exempt, prefixed by `deny_` (for example, returning `foo` will exempt `deny_foo`).
|
||||||
|
The rule can make any other assertion, for example, on the input or data documents.
|
||||||
|
This is useful to specify the exemption for a specific case.
|
||||||
|
|
||||||
|
Note that if you specify the empty string, the exception will match all rules named `deny`.
|
||||||
|
|
||||||
|
```
|
||||||
|
exception[rules] {
|
||||||
|
# Logic
|
||||||
|
|
||||||
|
rules = ["foo","bar"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The above would provide an exception from `deny_foo` and `deny_bar`.
|
||||||
|
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
```
|
||||||
|
package user.kubernetes.ID100
|
||||||
|
|
||||||
|
__rego_metadata := {
|
||||||
|
"id": "ID100",
|
||||||
|
"title": "Deployment not allowed",
|
||||||
|
"severity": "HIGH",
|
||||||
|
"type": "Kubernetes Custom Check",
|
||||||
|
}
|
||||||
|
|
||||||
|
deny_deployment[msg] {
|
||||||
|
input.kind == "Deployment"
|
||||||
|
msg = sprintf("Found deployment '%s' but deployments are not allowed", [name])
|
||||||
|
}
|
||||||
|
|
||||||
|
exception[rules] {
|
||||||
|
input.kind == "Deployment"
|
||||||
|
input.metadata.name == "allow-deployment"
|
||||||
|
|
||||||
|
rules := ["deployment"]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to apply rule-based exceptions to built-in policies, you have to define the exception under the same package.
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
``` rego
|
||||||
|
package builtin.kubernetes.KSV012
|
||||||
|
|
||||||
|
exception[rules] {
|
||||||
|
input.metadata.name == "can-run-as-root"
|
||||||
|
rules := [""]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This exception is applied to [KSV012][ksv012] in defsec.
|
||||||
|
You can get the package names in the [defsec repository][defsec] or the JSON output from Trivy.
|
||||||
|
|
||||||
|
For more details, see [an example][rule-example].
|
||||||
|
|
||||||
|
[ns-example]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/namespace-exception
|
||||||
|
[rule-example]: https://github.com/aquasecurity/trivy/tree/{{ git.commit }}/examples/misconf/rule-exception
|
||||||
|
[ksv012]: https://github.com/aquasecurity/defsec/blob/master/internal/rules/kubernetes/policies/pss/restricted/3_runs_as_root.rego
|
||||||
|
[defsec]: https://github.com/aquasecurity/defsec/
|
||||||
321
docs/docs/misconfiguration/scanning.md
Normal file
321
docs/docs/misconfiguration/scanning.md
Normal file
@@ -0,0 +1,321 @@
|
|||||||
|
# Misconfiguration Scanning
|
||||||
|
Trivy provides built-in policies to detect configuration issues in Docker, Kubernetes, Terraform and CloudFormation.
|
||||||
|
Also, you can write your own policies in [Rego][rego] to scan JSON, YAML, etc, like [Conftest][conftest].
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Quick start
|
||||||
|
|
||||||
|
Simply specify a directory containing IaC files such as Terraform, CloudFormation and Dockerfile.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ trivy config [YOUR_IaC_DIRECTORY]
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
```
|
||||||
|
$ ls build/
|
||||||
|
Dockerfile
|
||||||
|
$ trivy config ./build
|
||||||
|
2022-05-16T13:29:29.952+0100 INFO Detected config files: 1
|
||||||
|
|
||||||
|
Dockerfile (dockerfile)
|
||||||
|
=======================
|
||||||
|
Tests: 23 (SUCCESSES: 22, FAILURES: 1, EXCEPTIONS: 0)
|
||||||
|
Failures: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 0, CRITICAL: 0)
|
||||||
|
|
||||||
|
MEDIUM: Specify a tag in the 'FROM' statement for image 'alpine'
|
||||||
|
══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
When using a 'FROM' statement you should use a specific tag to avoid uncontrolled behavior when the image is updated.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ds001
|
||||||
|
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Dockerfile:1
|
||||||
|
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
1 [ FROM alpine:latest
|
||||||
|
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also enable misconfiguration detection in container image, filesystem and git repository scanning via `--security-checks config`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy image --security-checks config IMAGE_NAME
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ trivy fs --security-checks config /path/to/dir
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
Misconfiguration detection is not enabled by default in `image`, `fs` and `repo` subcommands.
|
||||||
|
|
||||||
|
Unlike the `config` subcommand, `image`, `fs` and `repo` subcommands can also scan for vulnerabilities and secrets at the same time.
|
||||||
|
You can specify `--security-checks vuln,config,secret` to enable vulnerability and secret detection as well as misconfiguration detection.
|
||||||
|
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
``` bash
|
||||||
|
$ ls myapp/
|
||||||
|
Dockerfile Pipfile.lock
|
||||||
|
$ trivy fs --security-checks vuln,config,secret --severity HIGH,CRITICAL myapp/
|
||||||
|
2022-05-16T13:42:21.440+0100 INFO Number of language-specific files: 1
|
||||||
|
2022-05-16T13:42:21.440+0100 INFO Detecting pipenv vulnerabilities...
|
||||||
|
2022-05-16T13:42:21.440+0100 INFO Detected config files: 1
|
||||||
|
|
||||||
|
Pipfile.lock (pipenv)
|
||||||
|
=====================
|
||||||
|
Total: 1 (HIGH: 1, CRITICAL: 0)
|
||||||
|
|
||||||
|
┌──────────┬────────────────┬──────────┬───────────────────┬───────────────┬───────────────────────────────────────────────────────────┐
|
||||||
|
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
|
||||||
|
├──────────┼────────────────┼──────────┼───────────────────┼───────────────┼───────────────────────────────────────────────────────────┤
|
||||||
|
│ httplib2 │ CVE-2021-21240 │ HIGH │ 0.12.1 │ 0.19.0 │ python-httplib2: Regular expression denial of service via │
|
||||||
|
│ │ │ │ │ │ malicious header │
|
||||||
|
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2021-21240 │
|
||||||
|
└──────────┴────────────────┴──────────┴───────────────────┴───────────────┴───────────────────────────────────────────────────────────┘
|
||||||
|
|
||||||
|
Dockerfile (dockerfile)
|
||||||
|
=======================
|
||||||
|
Tests: 17 (SUCCESSES: 16, FAILURES: 1, EXCEPTIONS: 0)
|
||||||
|
Failures: 1 (HIGH: 1, CRITICAL: 0)
|
||||||
|
|
||||||
|
HIGH: Last USER command in Dockerfile should not be 'root'
|
||||||
|
════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
Running containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ds002
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
Dockerfile:3
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
3 [ USER root
|
||||||
|
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
```
|
||||||
|
|
||||||
|
In the above example, Trivy detected vulnerabilities of Python dependencies and misconfigurations in Dockerfile.
|
||||||
|
|
||||||
|
## Type detection
|
||||||
|
The specified directory can contain mixed types of IaC files.
|
||||||
|
Trivy automatically detects config types and applies relevant policies.
|
||||||
|
|
||||||
|
For example, the following example holds IaC files for Terraform, CloudFormation, Kubernetes, Helm Charts, and Dockerfile in the same directory.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
$ ls iac/
|
||||||
|
Dockerfile deployment.yaml main.tf mysql-8.8.26.tar
|
||||||
|
$ trivy conf --severity HIGH,CRITICAL ./iac
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
2022-06-06T11:01:21.142+0100 INFO Detected config files: 8
|
||||||
|
|
||||||
|
Dockerfile (dockerfile)
|
||||||
|
|
||||||
|
Tests: 21 (SUCCESSES: 20, FAILURES: 1, EXCEPTIONS: 0)
|
||||||
|
Failures: 1 (MEDIUM: 0, HIGH: 1, CRITICAL: 0)
|
||||||
|
|
||||||
|
HIGH: Specify at least 1 USER command in Dockerfile with non-root user as argument
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
Running containers with 'root' user can lead to a container escape situation. It is a best practice to run containers as non-root users, which can be done by adding a 'USER' statement to the Dockerfile.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ds002
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
deployment.yaml (kubernetes)
|
||||||
|
|
||||||
|
Tests: 20 (SUCCESSES: 15, FAILURES: 5, EXCEPTIONS: 0)
|
||||||
|
Failures: 5 (MEDIUM: 4, HIGH: 1, CRITICAL: 0)
|
||||||
|
|
||||||
|
MEDIUM: Container 'hello-kubernetes' of Deployment 'hello-kubernetes' should set 'securityContext.allowPrivilegeEscalation' to false
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
A program inside the container can elevate its own privileges and run as root, which might give the program control over the container and node.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ksv001
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
deployment.yaml:16-19
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
16 ┌ - name: hello-kubernetes
|
||||||
|
17 │ image: hello-kubernetes:1.5
|
||||||
|
18 │ ports:
|
||||||
|
19 └ - containerPort: 8080
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
HIGH: Deployment 'hello-kubernetes' should not specify '/var/run/docker.socker' in 'spec.template.volumes.hostPath.path'
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
Mounting docker.sock from the host can give the container full root access to the host.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ksv006
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
deployment.yaml:6-29
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
6 ┌ replicas: 3
|
||||||
|
7 │ selector:
|
||||||
|
8 │ matchLabels:
|
||||||
|
9 │ app: hello-kubernetes
|
||||||
|
10 │ template:
|
||||||
|
11 │ metadata:
|
||||||
|
12 │ labels:
|
||||||
|
13 │ app: hello-kubernetes
|
||||||
|
14 └ spec:
|
||||||
|
..
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
MEDIUM: Container 'hello-kubernetes' of Deployment 'hello-kubernetes' should set 'securityContext.runAsNonRoot' to true
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
'runAsNonRoot' forces the running image to run as a non-root user to ensure least privileges.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ksv012
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
deployment.yaml:16-19
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
16 ┌ - name: hello-kubernetes
|
||||||
|
17 │ image: hello-kubernetes:1.5
|
||||||
|
18 │ ports:
|
||||||
|
19 └ - containerPort: 8080
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
MEDIUM: Deployment 'hello-kubernetes' should not set 'spec.template.volumes.hostPath'
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
HostPath volumes must be forbidden.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ksv023
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
deployment.yaml:6-29
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
6 ┌ replicas: 3
|
||||||
|
7 │ selector:
|
||||||
|
8 │ matchLabels:
|
||||||
|
9 │ app: hello-kubernetes
|
||||||
|
10 │ template:
|
||||||
|
11 │ metadata:
|
||||||
|
12 │ labels:
|
||||||
|
13 │ app: hello-kubernetes
|
||||||
|
14 └ spec:
|
||||||
|
..
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
MEDIUM: Deployment 'hello-kubernetes' should set 'securityContext.sysctl' to the allowed values
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
Sysctls can disable security mechanisms or affect all containers on a host, and should be disallowed except for an allowed 'safe' subset. A sysctl is considered safe if it is namespaced in the container or the Pod, and it is isolated from other Pods or processes on the same Node.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ksv026
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
deployment.yaml:6-29
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
6 ┌ replicas: 3
|
||||||
|
7 │ selector:
|
||||||
|
8 │ matchLabels:
|
||||||
|
9 │ app: hello-kubernetes
|
||||||
|
10 │ template:
|
||||||
|
11 │ metadata:
|
||||||
|
12 │ labels:
|
||||||
|
13 │ app: hello-kubernetes
|
||||||
|
14 └ spec:
|
||||||
|
..
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mysql-8.8.26.tar:templates/primary/statefulset.yaml (helm)
|
||||||
|
|
||||||
|
Tests: 20 (SUCCESSES: 18, FAILURES: 2, EXCEPTIONS: 0)
|
||||||
|
Failures: 2 (MEDIUM: 2, HIGH: 0, CRITICAL: 0)
|
||||||
|
|
||||||
|
MEDIUM: Container 'mysql' of StatefulSet 'mysql' should set 'securityContext.allowPrivilegeEscalation' to false
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
A program inside the container can elevate its own privileges and run as root, which might give the program control over the container and node.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ksv001
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
mysql-8.8.26.tar:templates/primary/statefulset.yaml:56-130
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
56 ┌ - name: mysql
|
||||||
|
57 │ image: docker.io/bitnami/mysql:8.0.28-debian-10-r23
|
||||||
|
58 │ imagePullPolicy: "IfNotPresent"
|
||||||
|
59 │ securityContext:
|
||||||
|
60 │ runAsUser: 1001
|
||||||
|
61 │ env:
|
||||||
|
62 │ - name: BITNAMI_DEBUG
|
||||||
|
63 │ value: "false"
|
||||||
|
64 └ - name: MYSQL_ROOT_PASSWORD
|
||||||
|
..
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
|
||||||
|
MEDIUM: Container 'mysql' of StatefulSet 'mysql' should set 'securityContext.runAsNonRoot' to true
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||||
|
'runAsNonRoot' forces the running image to run as a non-root user to ensure least privileges.
|
||||||
|
|
||||||
|
See https://avd.aquasec.com/misconfig/ksv012
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
mysql-8.8.26.tar:templates/primary/statefulset.yaml:56-130
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
56 ┌ - name: mysql
|
||||||
|
57 │ image: docker.io/bitnami/mysql:8.0.28-debian-10-r23
|
||||||
|
58 │ imagePullPolicy: "IfNotPresent"
|
||||||
|
59 │ securityContext:
|
||||||
|
60 │ runAsUser: 1001
|
||||||
|
61 │ env:
|
||||||
|
62 │ - name: BITNAMI_DEBUG
|
||||||
|
63 │ value: "false"
|
||||||
|
64 └ - name: MYSQL_ROOT_PASSWORD
|
||||||
|
..
|
||||||
|
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
You can see the config type next to each file name.
|
||||||
|
|
||||||
|
!!! example
|
||||||
|
``` bash
|
||||||
|
Dockerfile (dockerfile)
|
||||||
|
=======================
|
||||||
|
Tests: 23 (SUCCESSES: 22, FAILURES: 1, EXCEPTIONS: 0)
|
||||||
|
Failures: 1 (HIGH: 1, CRITICAL: 0)
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
deployment.yaml (kubernetes)
|
||||||
|
============================
|
||||||
|
Tests: 28 (SUCCESSES: 15, FAILURES: 13, EXCEPTIONS: 0)
|
||||||
|
Failures: 13 (MEDIUM: 4, HIGH: 1, CRITICAL: 0)
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
main.tf (terraform)
|
||||||
|
===================
|
||||||
|
Tests: 23 (SUCCESSES: 14, FAILURES: 9, EXCEPTIONS: 0)
|
||||||
|
Failures: 9 (HIGH: 6, CRITICAL: 1)
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
bucket.yaml (cloudformation)
|
||||||
|
============================
|
||||||
|
Tests: 9 (SUCCESSES: 3, FAILURES: 6, EXCEPTIONS: 0)
|
||||||
|
Failures: 6 (UNKNOWN: 0, LOW: 0, MEDIUM: 2, HIGH: 4, CRITICAL: 0)
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
mysql-8.8.26.tar:templates/primary/statefulset.yaml (helm)
|
||||||
|
==========================================================
|
||||||
|
Tests: 20 (SUCCESSES: 18, FAILURES: 2, EXCEPTIONS: 0)
|
||||||
|
Failures: 2 (MEDIUM: 2, HIGH: 0, CRITICAL: 0)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
See [here](https://github.com/aquasecurity/trivy/tree/{{ git.tag }}/examples/misconf/mixed)
|
||||||
|
|
||||||
|
[rego]: https://www.openpolicyagent.org/docs/latest/policy-language/
|
||||||
|
[conftest]: https://github.com/open-policy-agent/conftest/
|
||||||
|
|
||||||
32
docs/docs/references/cli/client.md
Normal file
32
docs/docs/references/cli/client.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Client
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy client - DEPRECATED client mode, use `trivy image` with `--server` option for remote scans now.
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy image --server value
|
||||||
|
|
||||||
|
trivy client [deprecated command options] image_name
|
||||||
|
|
||||||
|
DEPRECATED OPTIONS:
|
||||||
|
--template value, -t value output template [$TRIVY_TEMPLATE]
|
||||||
|
--format value, -f value format (table, json, sarif, template) (default: "table") [$TRIVY_FORMAT]
|
||||||
|
--input value, -i value input file path instead of image name [$TRIVY_INPUT]
|
||||||
|
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
|
||||||
|
--output value, -o value output file name [$TRIVY_OUTPUT]
|
||||||
|
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
|
||||||
|
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
|
||||||
|
--removed-pkgs detect vulnerabilities of removed packages (only for Alpine) (default: false) [$TRIVY_REMOVED_PKGS]
|
||||||
|
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
|
||||||
|
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
|
||||||
|
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
|
||||||
|
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
|
||||||
|
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
|
||||||
|
--offline-scan do not issue API requests to identify dependencies (default: false) [$TRIVY_OFFLINE_SCAN]
|
||||||
|
--token value for authentication [$TRIVY_TOKEN]
|
||||||
|
--token-header value specify a header name for token (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER]
|
||||||
|
--remote value server address (default: "http://localhost:4954") [$TRIVY_REMOTE]
|
||||||
|
--custom-headers value custom headers [$TRIVY_CUSTOM_HEADERS]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
29
docs/docs/references/cli/config.md
Normal file
29
docs/docs/references/cli/config.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Config
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
NAME:
|
||||||
|
trivy config - scan config files
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy config [command options] dir
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--template value, -t value output template [$TRIVY_TEMPLATE]
|
||||||
|
--format value, -f value format (table, json, sarif, template) (default: "table") [$TRIVY_FORMAT]
|
||||||
|
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
|
||||||
|
--output value, -o value output file name [$TRIVY_OUTPUT]
|
||||||
|
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
|
||||||
|
--skip-policy-update skip updating built-in policies (default: false) [$TRIVY_SKIP_POLICY_UPDATE]
|
||||||
|
--reset remove all caches and database (default: false) [$TRIVY_RESET]
|
||||||
|
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
|
||||||
|
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
|
||||||
|
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
|
||||||
|
--skip-files value specify the file paths to skip traversal [$TRIVY_SKIP_FILES]
|
||||||
|
--skip-dirs value specify the directories where the traversal is skipped [$TRIVY_SKIP_DIRS]
|
||||||
|
--policy value, --config-policy value specify paths to the Rego policy files directory, applying config files [$TRIVY_POLICY]
|
||||||
|
--data value, --config-data value specify paths from which data for the Rego policies will be recursively loaded [$TRIVY_DATA]
|
||||||
|
--policy-namespaces value, --namespaces value Rego namespaces (default: "users") [$TRIVY_POLICY_NAMESPACES]
|
||||||
|
--file-patterns value specify file patterns [$TRIVY_FILE_PATTERNS]
|
||||||
|
--include-successes include successes of misconfigurations (default: false) [$TRIVY_INCLUDE_SUCCESSES]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
42
docs/docs/references/cli/fs.md
Normal file
42
docs/docs/references/cli/fs.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# Filesystem
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy filesystem - scan local filesystem for language-specific dependencies and config files
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy filesystem [command options] path
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--template value, -t value output template [$TRIVY_TEMPLATE]
|
||||||
|
--format value, -f value format (table, json, sarif, template) (default: "table") [$TRIVY_FORMAT]
|
||||||
|
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
|
||||||
|
--output value, -o value output file name [$TRIVY_OUTPUT]
|
||||||
|
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
|
||||||
|
--skip-db-update, --skip-update skip updating vulnerability database (default: false) [$TRIVY_SKIP_UPDATE, $TRIVY_SKIP_DB_UPDATE]
|
||||||
|
--skip-policy-update skip updating built-in policies (default: false) [$TRIVY_SKIP_POLICY_UPDATE]
|
||||||
|
--insecure allow insecure server connections when using SSL (default: false) [$TRIVY_INSECURE]
|
||||||
|
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
|
||||||
|
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
|
||||||
|
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
|
||||||
|
--security-checks value comma-separated list of what security issues to detect (vuln,config) (default: "vuln") [$TRIVY_SECURITY_CHECKS]
|
||||||
|
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
|
||||||
|
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
|
||||||
|
--cache-ttl value cache TTL when using redis as cache backend (default: 0s) [$TRIVY_CACHE_TTL]
|
||||||
|
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
|
||||||
|
--no-progress suppress progress bar (default: false) [$TRIVY_NO_PROGRESS]
|
||||||
|
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
|
||||||
|
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
|
||||||
|
--offline-scan do not issue API requests to identify dependencies (default: false) [$TRIVY_OFFLINE_SCAN]
|
||||||
|
--db-repository value OCI repository to retrieve trivy-db from (default: "ghcr.io/aquasecurity/trivy-db") [$TRIVY_DB_REPOSITORY]
|
||||||
|
--skip-files value specify the file paths to skip traversal (accepts multiple inputs) [$TRIVY_SKIP_FILES]
|
||||||
|
--skip-dirs value specify the directories where the traversal is skipped (accepts multiple inputs) [$TRIVY_SKIP_DIRS]
|
||||||
|
--config-policy value specify paths to the Rego policy files directory, applying config files (accepts multiple inputs) [$TRIVY_CONFIG_POLICY]
|
||||||
|
--config-data value specify paths from which data for the Rego policies will be recursively loaded (accepts multiple inputs) [$TRIVY_CONFIG_DATA]
|
||||||
|
--policy-namespaces value, --namespaces value Rego namespaces (default: "users") (accepts multiple inputs) [$TRIVY_POLICY_NAMESPACES]
|
||||||
|
--server value server address [$TRIVY_SERVER]
|
||||||
|
--token value for authentication in client/server mode [$TRIVY_TOKEN]
|
||||||
|
--token-header value specify a header name for token in client/server mode (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER]
|
||||||
|
--custom-headers value custom headers in client/server mode (accepts multiple inputs) [$TRIVY_CUSTOM_HEADERS]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
43
docs/docs/references/cli/image.md
Normal file
43
docs/docs/references/cli/image.md
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Image
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy image - scan an image
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy image [command options] image_name
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--template value, -t value output template [$TRIVY_TEMPLATE]
|
||||||
|
--format value, -f value format (table, json, sarif, template) (default: "table") [$TRIVY_FORMAT]
|
||||||
|
--input value, -i value input file path instead of image name [$TRIVY_INPUT]
|
||||||
|
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
|
||||||
|
--output value, -o value output file name [$TRIVY_OUTPUT]
|
||||||
|
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
|
||||||
|
--skip-db-update, --skip-update skip updating vulnerability database (default: false) [$TRIVY_SKIP_UPDATE, $TRIVY_SKIP_DB_UPDATE]
|
||||||
|
--download-db-only download/update vulnerability database but don't run a scan (default: false) [$TRIVY_DOWNLOAD_DB_ONLY]
|
||||||
|
--reset remove all caches and database (default: false) [$TRIVY_RESET]
|
||||||
|
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
|
||||||
|
--no-progress suppress progress bar (default: false) [$TRIVY_NO_PROGRESS]
|
||||||
|
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
|
||||||
|
--removed-pkgs detect vulnerabilities of removed packages (only for Alpine) (default: false) [$TRIVY_REMOVED_PKGS]
|
||||||
|
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
|
||||||
|
--security-checks value comma-separated list of what security issues to detect (vuln,config,secret) (default: "vuln,secret") [$TRIVY_SECURITY_CHECKS]
|
||||||
|
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
|
||||||
|
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
|
||||||
|
--light deprecated (default: false) [$TRIVY_LIGHT]
|
||||||
|
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
|
||||||
|
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
|
||||||
|
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
|
||||||
|
--cache-ttl value cache TTL when using redis as cache backend (default: 0s) [$TRIVY_CACHE_TTL]
|
||||||
|
--offline-scan do not issue API requests to identify dependencies (default: false) [$TRIVY_OFFLINE_SCAN]
|
||||||
|
--insecure allow insecure server connections when using SSL (default: false) [$TRIVY_INSECURE]
|
||||||
|
--db-repository value OCI repository to retrieve trivy-db from (default: "ghcr.io/aquasecurity/trivy-db") [$TRIVY_DB_REPOSITORY]
|
||||||
|
--skip-files value specify the file paths to skip traversal (accepts multiple inputs) [$TRIVY_SKIP_FILES]
|
||||||
|
--skip-dirs value specify the directories where the traversal is skipped (accepts multiple inputs) [$TRIVY_SKIP_DIRS]
|
||||||
|
--server value server address [$TRIVY_SERVER]
|
||||||
|
--token value for authentication in client/server mode [$TRIVY_TOKEN]
|
||||||
|
--token-header value specify a header name for token in client/server mode (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER]
|
||||||
|
--custom-headers value custom headers in client/server mode (accepts multiple inputs) [$TRIVY_CUSTOM_HEADERS]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
32
docs/docs/references/cli/index.md
Normal file
32
docs/docs/references/cli/index.md
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
Trivy has several sub commands, image, fs, repo, client and server.
|
||||||
|
|
||||||
|
``` bash
|
||||||
|
NAME:
|
||||||
|
trivy - Scanner for vulnerabilities in container images, file systems, and Git repositories, as well as for configuration issues and hard-coded secrets
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy [global options] command [command options] target
|
||||||
|
|
||||||
|
VERSION:
|
||||||
|
dev
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
image, i scan an image
|
||||||
|
filesystem, fs scan local filesystem for language-specific dependencies and config files
|
||||||
|
rootfs scan rootfs
|
||||||
|
repository, repo scan remote repository
|
||||||
|
server, s server mode
|
||||||
|
config, conf scan config files
|
||||||
|
plugin, p manage plugins
|
||||||
|
kubernetes, k8s scan kubernetes vulnerabilities and misconfigurations
|
||||||
|
sbom generate SBOM for an artifact
|
||||||
|
version print the version
|
||||||
|
help, h Shows a list of commands or help for one command
|
||||||
|
|
||||||
|
GLOBAL OPTIONS:
|
||||||
|
--quiet, -q suppress progress bar and log output (default: false) [$TRIVY_QUIET]
|
||||||
|
--debug, -d debug mode (default: false) [$TRIVY_DEBUG]
|
||||||
|
--cache-dir value cache directory (default: "/Users/teppei/Library/Caches/trivy") [$TRIVY_CACHE_DIR]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
--version, -v print the version (default: false)
|
||||||
|
```
|
||||||
17
docs/docs/references/cli/module.md
Normal file
17
docs/docs/references/cli/module.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Module
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy module - manage modules
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy module command [command options] [arguments...]
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
install, i install a module
|
||||||
|
uninstall, u uninstall a module
|
||||||
|
help, h Shows a list of commands or help for one command
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
21
docs/docs/references/cli/plugin.md
Normal file
21
docs/docs/references/cli/plugin.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Plugin
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy plugin - manage plugins
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy plugin command [command options] plugin_uri
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
install, i install a plugin
|
||||||
|
uninstall, u uninstall a plugin
|
||||||
|
list, l list installed plugin
|
||||||
|
info information about a plugin
|
||||||
|
run, r run a plugin on the fly
|
||||||
|
update update an existing plugin
|
||||||
|
help, h Shows a list of commands or help for one command
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
38
docs/docs/references/cli/repo.md
Normal file
38
docs/docs/references/cli/repo.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
# Repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy repository - scan remote repository
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy repository [command options] repo_url
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--template value, -t value output template [$TRIVY_TEMPLATE]
|
||||||
|
--format value, -f value format (table, json, sarif, template) (default: "table") [$TRIVY_FORMAT]
|
||||||
|
--input value, -i value input file path instead of image name [$TRIVY_INPUT]
|
||||||
|
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
|
||||||
|
--output value, -o value output file name [$TRIVY_OUTPUT]
|
||||||
|
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
|
||||||
|
--skip-db-update, --skip-update skip updating vulnerability database (default: false) [$TRIVY_SKIP_UPDATE, $TRIVY_SKIP_DB_UPDATE]
|
||||||
|
--skip-policy-update skip updating built-in policies (default: false) [$TRIVY_SKIP_POLICY_UPDATE]
|
||||||
|
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
|
||||||
|
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
|
||||||
|
--removed-pkgs detect vulnerabilities of removed packages (only for Alpine) (default: false) [$TRIVY_REMOVED_PKGS]
|
||||||
|
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
|
||||||
|
--security-checks value comma-separated list of what security issues to detect (vuln,config) (default: "vuln") [$TRIVY_SECURITY_CHECKS]
|
||||||
|
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
|
||||||
|
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
|
||||||
|
--cache-ttl value cache TTL when using redis as cache backend (default: 0s) [$TRIVY_CACHE_TTL]
|
||||||
|
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
|
||||||
|
--no-progress suppress progress bar (default: false) [$TRIVY_NO_PROGRESS]
|
||||||
|
--quiet, -q suppress progress bar and log output (default: false) [$TRIVY_QUIET]
|
||||||
|
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
|
||||||
|
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
|
||||||
|
--offline-scan do not issue API requests to identify dependencies (default: false) [$TRIVY_OFFLINE_SCAN]
|
||||||
|
--insecure allow insecure server connections when using SSL (default: false) [$TRIVY_INSECURE]
|
||||||
|
--db-repository value OCI repository to retrieve trivy-db from (default: "ghcr.io/aquasecurity/trivy-db") [$TRIVY_DB_REPOSITORY]
|
||||||
|
--skip-files value specify the file paths to skip traversal (accepts multiple inputs) [$TRIVY_SKIP_FILES]
|
||||||
|
--skip-dirs value specify the directories where the traversal is skipped (accepts multiple inputs) [$TRIVY_SKIP_DIRS]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
36
docs/docs/references/cli/rootfs.md
Normal file
36
docs/docs/references/cli/rootfs.md
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
# Rootfs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy rootfs - scan rootfs
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy rootfs [command options] dir
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--template value, -t value output template [$TRIVY_TEMPLATE]
|
||||||
|
--format value, -f value format (table, json, sarif, template) (default: "table") [$TRIVY_FORMAT]
|
||||||
|
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
|
||||||
|
--output value, -o value output file name [$TRIVY_OUTPUT]
|
||||||
|
--exit-code value Exit code when vulnerabilities were found (default: 0) [$TRIVY_EXIT_CODE]
|
||||||
|
--skip-db-update, --skip-update skip updating vulnerability database (default: false) [$TRIVY_SKIP_UPDATE, $TRIVY_SKIP_DB_UPDATE]
|
||||||
|
--insecure allow insecure server connections when using SSL (default: false) [$TRIVY_INSECURE]
|
||||||
|
--skip-policy-update skip updating built-in policies (default: false) [$TRIVY_SKIP_POLICY_UPDATE]
|
||||||
|
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
|
||||||
|
--ignore-unfixed display only fixed vulnerabilities (default: false) [$TRIVY_IGNORE_UNFIXED]
|
||||||
|
--vuln-type value comma-separated list of vulnerability types (os,library) (default: "os,library") [$TRIVY_VULN_TYPE]
|
||||||
|
--security-checks value comma-separated list of what security issues to detect (vuln,config) (default: "vuln") [$TRIVY_SECURITY_CHECKS]
|
||||||
|
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
|
||||||
|
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
|
||||||
|
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
|
||||||
|
--no-progress suppress progress bar (default: false) [$TRIVY_NO_PROGRESS]
|
||||||
|
--ignore-policy value specify the Rego file to evaluate each vulnerability [$TRIVY_IGNORE_POLICY]
|
||||||
|
--list-all-pkgs enabling the option will output all packages regardless of vulnerability (default: false) [$TRIVY_LIST_ALL_PKGS]
|
||||||
|
--offline-scan do not issue API requests to identify dependencies (default: false) [$TRIVY_OFFLINE_SCAN]
|
||||||
|
--skip-files value specify the file paths to skip traversal [$TRIVY_SKIP_FILES]
|
||||||
|
--skip-dirs value specify the directories where the traversal is skipped [$TRIVY_SKIP_DIRS]
|
||||||
|
--config-policy value specify paths to the Rego policy files directory, applying config files [$TRIVY_CONFIG_POLICY]
|
||||||
|
--config-data value specify paths from which data for the Rego policies will be recursively loaded [$TRIVY_CONFIG_DATA]
|
||||||
|
--policy-namespaces value, --namespaces value Rego namespaces (default: "users") [$TRIVY_POLICY_NAMESPACES]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
27
docs/docs/references/cli/sbom.md
Normal file
27
docs/docs/references/cli/sbom.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# SBOM
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy sbom - generate SBOM for an artifact
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy sbom [command options] ARTIFACT
|
||||||
|
|
||||||
|
DESCRIPTION:
|
||||||
|
ARTIFACT can be a container image, file path/directory, git repository or container image archive. See examples.
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--output value, -o value output file name [$TRIVY_OUTPUT]
|
||||||
|
--clear-cache, -c clear image caches without scanning (default: false) [$TRIVY_CLEAR_CACHE]
|
||||||
|
--ignorefile value specify .trivyignore file (default: ".trivyignore") [$TRIVY_IGNOREFILE]
|
||||||
|
--timeout value timeout (default: 5m0s) [$TRIVY_TIMEOUT]
|
||||||
|
--severity value, -s value severities of vulnerabilities to be displayed (comma separated) (default: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL") [$TRIVY_SEVERITY]
|
||||||
|
--offline-scan do not issue API requests to identify dependencies (default: false) [$TRIVY_OFFLINE_SCAN]
|
||||||
|
--db-repository value OCI repository to retrieve trivy-db from (default: "ghcr.io/aquasecurity/trivy-db") [$TRIVY_DB_REPOSITORY]
|
||||||
|
--insecure allow insecure server connections when using SSL (default: false) [$TRIVY_INSECURE]
|
||||||
|
--skip-files value specify the file paths to skip traversal (accepts multiple inputs) [$TRIVY_SKIP_FILES]
|
||||||
|
--skip-dirs value specify the directories where the traversal is skipped (accepts multiple inputs) [$TRIVY_SKIP_DIRS]
|
||||||
|
--artifact-type value, --type value input artifact type (image, fs, repo, archive) (default: "image") [$TRIVY_ARTIFACT_TYPE]
|
||||||
|
--sbom-format value, --format value SBOM format (cyclonedx, spdx, spdx-json) (default: "cyclonedx") [$TRIVY_SBOM_FORMAT]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
22
docs/docs/references/cli/server.md
Normal file
22
docs/docs/references/cli/server.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME:
|
||||||
|
trivy server - server mode
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
trivy server [command options] [arguments...]
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
--skip-db-update, --skip-update skip updating vulnerability database (default: false) [$TRIVY_SKIP_UPDATE, $TRIVY_SKIP_DB_UPDATE]
|
||||||
|
--download-db-only download/update vulnerability database but don't run a scan (default: false) [$TRIVY_DOWNLOAD_DB_ONLY]
|
||||||
|
--insecure allow insecure server connections when using SSL (default: false) [$TRIVY_INSECURE]
|
||||||
|
--reset remove all caches and database (default: false) [$TRIVY_RESET]
|
||||||
|
--cache-backend value cache backend (e.g. redis://localhost:6379) (default: "fs") [$TRIVY_CACHE_BACKEND]
|
||||||
|
--cache-ttl value cache TTL when using redis as cache backend (default: 0s) [$TRIVY_CACHE_TTL]
|
||||||
|
--db-repository value OCI repository to retrieve trivy-db from (default: "ghcr.io/aquasecurity/trivy-db") [$TRIVY_DB_REPOSITORY]
|
||||||
|
--token value for authentication in client/server mode [$TRIVY_TOKEN]
|
||||||
|
--token-header value specify a header name for token in client/server mode (default: "Trivy-Token") [$TRIVY_TOKEN_HEADER]
|
||||||
|
--listen value listen address (default: "localhost:4954") [$TRIVY_LISTEN]
|
||||||
|
--help, -h show help (default: false)
|
||||||
|
```
|
||||||
191
docs/docs/references/modes/client-server.md
Normal file
191
docs/docs/references/modes/client-server.md
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
# Client/Server
|
||||||
|
|
||||||
|
Trivy has client/server mode. Trivy server has vulnerability database and Trivy client doesn't have to download vulnerability database. It is useful if you want to scan images or files at multiple locations and do not want to download the database at every location.
|
||||||
|
|
||||||
|
## Server
|
||||||
|
At first, you need to launch Trivy server. It downloads vulnerability database automatically and continue to fetch the latest DB in the background.
|
||||||
|
```
|
||||||
|
$ trivy server --listen localhost:8080
|
||||||
|
2019-12-12T15:17:06.551+0200 INFO Need to update DB
|
||||||
|
2019-12-12T15:17:56.706+0200 INFO Reopening DB...
|
||||||
|
2019-12-12T15:17:56.707+0200 INFO Listening localhost:8080...
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to accept a connection from outside, you have to specify `0.0.0.0` or your ip address, not `localhost`.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy server --listen 0.0.0.0:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
## Remote image scan
|
||||||
|
Then, specify the server address for `image` command.
|
||||||
|
```
|
||||||
|
$ trivy image --server http://localhost:8080 alpine:3.10
|
||||||
|
```
|
||||||
|
**Note**: It's important to specify the protocol (http or https).
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
|
||||||
|
```
|
||||||
|
alpine:3.10 (alpine 3.10.2)
|
||||||
|
===========================
|
||||||
|
Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 2, HIGH: 0, CRITICAL: 0)
|
||||||
|
|
||||||
|
+---------+------------------+----------+-------------------+---------------+
|
||||||
|
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION |
|
||||||
|
+---------+------------------+----------+-------------------+---------------+
|
||||||
|
| openssl | CVE-2019-1549 | MEDIUM | 1.1.1c-r0 | 1.1.1d-r0 |
|
||||||
|
+ +------------------+ + + +
|
||||||
|
| | CVE-2019-1563 | | | |
|
||||||
|
+ +------------------+----------+ + +
|
||||||
|
| | CVE-2019-1547 | LOW | | |
|
||||||
|
+---------+------------------+----------+-------------------+---------------+
|
||||||
|
```
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Remote scan of local filesystem
|
||||||
|
Also, there is a way to scan local file system:
|
||||||
|
```shell
|
||||||
|
$ trivy fs --server http://localhost:8080 --severity CRITICAL ./integration/testdata/fixtures/fs/pom/
|
||||||
|
```
|
||||||
|
**Note**: It's important to specify the protocol (http or https).
|
||||||
|
<details>
|
||||||
|
<summary>Result</summary>
|
||||||
|
pom.xml (pom)
|
||||||
|
=============
|
||||||
|
Total: 24 (CRITICAL: 24)
|
||||||
|
|
||||||
|
+---------------------------------------------+------------------+----------+-------------------+--------------------------------+---------------------------------------+
|
||||||
|
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
|
||||||
|
+---------------------------------------------+------------------+----------+-------------------+--------------------------------+---------------------------------------+
|
||||||
|
| com.fasterxml.jackson.core:jackson-databind | CVE-2017-17485 | CRITICAL | 2.9.1 | 2.8.11, 2.9.4 | jackson-databind: Unsafe |
|
||||||
|
| | | | | | deserialization due to |
|
||||||
|
| | | | | | incomplete black list (incomplete |
|
||||||
|
| | | | | | fix for CVE-2017-15095)... |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2017-17485 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2018-11307 | | | 2.7.9.4, 2.8.11.2, 2.9.6 | jackson-databind: Potential |
|
||||||
|
| | | | | | information exfiltration with |
|
||||||
|
| | | | | | default typing, serialization |
|
||||||
|
| | | | | | gadget from MyBatis |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-11307 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2018-14718 | | | 2.6.7.2, 2.9.7 | jackson-databind: arbitrary code |
|
||||||
|
| | | | | | execution in slf4j-ext class |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-14718 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2018-14719 | | | | jackson-databind: arbitrary |
|
||||||
|
| | | | | | code execution in blaze-ds-opt |
|
||||||
|
| | | | | | and blaze-ds-core classes |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-14719 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2018-14720 | | | | jackson-databind: exfiltration/XXE |
|
||||||
|
| | | | | | in some JDK classes |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-14720 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2018-14721 | | | | jackson-databind: server-side request |
|
||||||
|
| | | | | | forgery (SSRF) in axis2-jaxws class |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-14721 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2018-19360 | | | 2.6.7.3, 2.7.9.5, 2.8.11.3, | jackson-databind: improper |
|
||||||
|
| | | | | 2.9.8 | polymorphic deserialization |
|
||||||
|
| | | | | | in axis2-transport-jms class |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-19360 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2018-19361 | | | | jackson-databind: improper |
|
||||||
|
| | | | | | polymorphic deserialization |
|
||||||
|
| | | | | | in openjpa class |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-19361 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2018-19362 | | | | jackson-databind: improper |
|
||||||
|
| | | | | | polymorphic deserialization |
|
||||||
|
| | | | | | in jboss-common-core class |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-19362 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2018-7489 | | | 2.7.9.3, 2.8.11.1, 2.9.5 | jackson-databind: incomplete fix |
|
||||||
|
| | | | | | for CVE-2017-7525 permits unsafe |
|
||||||
|
| | | | | | serialization via c3p0 libraries |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2018-7489 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-14379 | | | 2.7.9.6, 2.8.11.4, 2.9.9.2 | jackson-databind: default |
|
||||||
|
| | | | | | typing mishandling leading |
|
||||||
|
| | | | | | to remote code execution |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-14379 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-14540 | | | 2.9.10 | jackson-databind: |
|
||||||
|
| | | | | | Serialization gadgets in |
|
||||||
|
| | | | | | com.zaxxer.hikari.HikariConfig |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-14540 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-14892 | | | 2.6.7.3, 2.8.11.5, 2.9.10 | jackson-databind: Serialization |
|
||||||
|
| | | | | | gadgets in classes of the |
|
||||||
|
| | | | | | commons-configuration package |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-14892 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-14893 | | | 2.8.11.5, 2.9.10 | jackson-databind: |
|
||||||
|
| | | | | | Serialization gadgets in |
|
||||||
|
| | | | | | classes of the xalan package |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-14893 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-16335 | | | 2.9.10 | jackson-databind: |
|
||||||
|
| | | | | | Serialization gadgets in |
|
||||||
|
| | | | | | com.zaxxer.hikari.HikariDataSource |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-16335 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-16942 | | | 2.9.10.1 | jackson-databind: |
|
||||||
|
| | | | | | Serialization gadgets in |
|
||||||
|
| | | | | | org.apache.commons.dbcp.datasources.* |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-16942 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2019-16943 | | | | jackson-databind: |
|
||||||
|
| | | | | | Serialization gadgets in |
|
||||||
|
| | | | | | com.p6spy.engine.spy.P6DataSource |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-16943 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-17267 | | | 2.9.10 | jackson-databind: Serialization |
|
||||||
|
| | | | | | gadgets in classes of |
|
||||||
|
| | | | | | the ehcache package |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-17267 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-17531 | | | 2.9.10.1 | jackson-databind: |
|
||||||
|
| | | | | | Serialization gadgets in |
|
||||||
|
| | | | | | org.apache.log4j.receivers.db.* |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-17531 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2019-20330 | | | 2.8.11.5, 2.9.10.2 | jackson-databind: lacks |
|
||||||
|
| | | | | | certain net.sf.ehcache blocking |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2019-20330 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2020-8840 | | | 2.7.9.7, 2.8.11.5, 2.9.10.3 | jackson-databind: Lacks certain |
|
||||||
|
| | | | | | xbean-reflect/JNDI blocking |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-8840 |
|
||||||
|
+ +------------------+ + +--------------------------------+---------------------------------------+
|
||||||
|
| | CVE-2020-9546 | | | 2.7.9.7, 2.8.11.6, 2.9.10.4 | jackson-databind: Serialization |
|
||||||
|
| | | | | | gadgets in shaded-hikari-config |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-9546 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2020-9547 | | | | jackson-databind: Serialization |
|
||||||
|
| | | | | | gadgets in ibatis-sqlmap |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-9547 |
|
||||||
|
+ +------------------+ + + +---------------------------------------+
|
||||||
|
| | CVE-2020-9548 | | | | jackson-databind: Serialization |
|
||||||
|
| | | | | | gadgets in anteros-core |
|
||||||
|
| | | | | | -->avd.aquasec.com/nvd/cve-2020-9548 |
|
||||||
|
+---------------------------------------------+------------------+----------+-------------------+--------------------------------+---------------------------------------+
|
||||||
|
</details>
|
||||||
|
|
||||||
|
## Authentication
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy server --listen localhost:8080 --token dummy
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
$ trivy image --server http://localhost:8080 --token dummy alpine:3.10
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user