Skip to content

Commit 67fd81f

Browse files
authored
Merge branch 'main' into WwyOzd7TG1
Signed-off-by: Andrés Vega <av@messier42.com>
2 parents cec0a29 + 1fd5e48 commit 67fd81f

File tree

25 files changed

+189
-157
lines changed

25 files changed

+189
-157
lines changed

.github/auto_request_review.yml

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ reviewers:
2525
- mlieberman85
2626
- ragashreeshekar
2727
- sublimino
28+
- eddie-knight
2829
supply-chain-security-reviewers:
2930
- mnm678
3031
- mlieberman85

CODEOWNERS

-10
This file was deleted.

README.md

+28-23
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# CNCF Security Technical Advisory Group
1+
# Security Technical Advisory Group
22

33
![Cloud Native Security Logo](/design/logo/cloud-native-security-horizontal-darkmodesafe.svg)
44

@@ -41,7 +41,7 @@ There is a growing ecosystem of tools that promises to unlock developer producti
4141
## Publications
4242

4343
TAG Security has published several resources for the community, which can be
44-
found in the [publications](PUBLICATIONS.md) document.
44+
found under [publications](publications/README.md).
4545

4646
## Governance
4747

@@ -122,32 +122,37 @@ seen [here](governance/related-groups/README.md)
122122

123123
### Security TAG Chairs
124124

125-
- Andrew Martin ([@sublimino](https://github.com/sublimino)), ControlPlane [Chair term: 3/17/2022 - 3/17/2024]
126-
- Pushkar Joglekar ([@PushkarJ](https://github.com/PushkarJ)), Independent [Chair term: 6/3/2023 - 6/3/2025]
127-
- Marina Moore ([@mnm678](https://github.com/mnm678)), NYU [Chair term: 10/3/2023 - 10/3/2025]
125+
| Name | Organization | Term | Handle |
126+
|-----------------------|------------------------|---------------------|-----------|
127+
| Pushkar Joglekar | Independent | June, 2023 - June, 2025 | @PushkarJ |
128+
| Marina Moore | Independent | October, 2023 - October, 2025 | @mnm678 |
129+
| Eddie Knight | Sonatype | May, 2024 - May, 2026 | @eddie-knight |
130+
128131

129132
### Tech Leads
130133

131-
- Justin Cappos ([@JustinCappos](https://github.com/JustinCappos)), New York
132-
University
133-
- Ash Narkar ([@ashutosh-narkar](https://github.com/ashutosh-narkar)), Styra
134-
- Andres Vega ([@anvega](https://github.com/anvega))
135-
- Ragashree Shekar ([@ragashreeshekar](https://github.com/ragashreeshekar)), Independent
136-
- Michael Lieberman ([@mlieberman85](https://github.com/mlieberman85)), Kusari
134+
| Name | Organization | Handle |
135+
|-----------------------|------------------------|---------------------|
136+
| Justin Cappos | New York University | @JustinCappos |
137+
| Ash Narkar | Styra | @ashutosh-narkar |
138+
| Andrés Vega | M42 | @anvega |
139+
| Ragashree Shekar | Independent | @ragashreeshekar |
140+
| Michael Lieberman | Kusari | @mlieberman85 |
141+
| John Kjell | TestifySec | @jkjell |
142+
137143

138144
### Security TAG Chair Emeriti
139145

140-
- Dan Shaw ([@dshaw](https://github.com/dshaw)),
141-
PayPal [Chair term: 6/3/2019 - 9/3/2020]
142-
- Sarah Allen ([@ultrasaurus](https://github.com/ultrasaurus)), [Chair term:
143-
6/3/2019 - 6/3/2021]
144-
- Jeyappragash JJ ([@pragashj](https://github.com/pragashj)),
145-
Tetrate.io [Chair term: 6/3/2019 - 6/3/2021]
146-
- Emily Fox ([@TheFoxAtWork](https://github.com/TheFoxAtWork)),
147-
Apple [Chair term: 9/28/2020 - 2/4/2022]
148-
- Brandon Lum ([@lumjjb](https://github.com/lumjjb)), Google [Chair term:
149-
6/3/2021 - 6/3/2023]
150-
- Aradhana Chetal ([@achetal01](https://github.com/achetal01)), TIAA [Chair term: 6/3/2021 - 9/3/2023]
146+
| Name | Organization | Term | Handle |
147+
|-----------------------|------------------------|---------------------|-----------|
148+
| Dan Shaw | PayPal | June, 2019 - September, 2020 | @dshaw |
149+
| Sarah Allen | | June, 2019 - June, 2021 | @ultrasaurus |
150+
| Jeyappragash JJ | Tetrate.io | June, 2019 - June, 2021 | @pragashj |
151+
| Emily Fox | Apple | September, 2020 - February, 2022 | @TheFoxAtWork |
152+
| Brandon Lum | Google | June, 2021 - June, 2023 | @lumjjb |
153+
| Aradhana Chetal | TIAA | June, 2021 - September, 2023 | @achetal01 |
154+
| Andrew Martin | ControlPlane | March, 2022 - March, 2024 | @sublimino|
155+
151156

152157
### On-going projects
153158

@@ -175,7 +180,7 @@ the project and its risk profile.
175180
Facilitator: Justin Cappos ([@JustinCappos](https://github.com/JustinCappos)),
176181
New York University
177182

178-
Co-chair representatives: @sublimino @PushkarJ
183+
Co-chair representatives: @PushkarJ @eddie-knight
179184

180185
#### Software Supply Chain Security
181186

PUBLICATIONS.md publications/README.md

-6
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,9 @@ them
103103

104104
- [Markdown](https://github.com/cncf/tag-security/tree/main/supply-chain-security/compromises)
105105

106-
107-
108106
## Use Cases & Personas
109107

110108
List of use cases to enable secure access, policy control and safety for users
111109
of cloud native technology
112110

113111
- [Markdown](https://github.com/cncf/tag-security/blob/main/usecase-personas/README.md)
114-
115-
116-
117-

security-fuzzing-handbook/fuzzing-handbook.md

+38-38
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ This chapter goes over background concepts of fuzzing and gives a practical demo
6060
## Fuzzing foundations
6161
Fuzzing is a program analysis technique closely connected to testing. In testing, a common practice is to execute code using a fixed input setting. In fuzzing, the testing is done using pseudo-random data as input to a target piece of code, meaning the target code is run over and over again with pseudo-random data as input. The goal of fuzzing is to discover if any arbitrary input can lead to a bug in the target code. For example, a simple way to fuzz a modern browser is to generate random files and then open each file in the browser with the goal of identifying potential patterns that can cause issues in the browser.
6262

63-
The common set up when fuzzing a piece of software is to construct a fuzzing set up for the code and then run this fuzzer for an extended period of time, and monitor if any bugs occur in the target code during the process. The fuzzer can be run in many settings, including running it locally locally, as part of a CI/CD pipeline or part of a larger management framework for handling the running of fuzzers. The specific time run for the fuzzer ranges from a few minutes to hundreds or even thousands of hours.
63+
The common set up when fuzzing a piece of software is to construct a fuzzing set up for the code and then run this fuzzer for an extended period of time, and monitor if any bugs occur in the target code during the process. The fuzzer can be run in many settings, including running it locally, as part of a CI/CD pipeline or part of a larger management framework for handling the running of fuzzers. The specific time run for the fuzzer ranges from a few minutes to hundreds or even thousands of hours.
6464

6565
The core technique of fuzzing is simple in that it executes target code indefinitely using pseudo-random input. However, fuzzing comes in many flavors and in this handbook we will be concerned with the concert of coverage-guided fuzzing. This is a technique that relies on monitoring the target code under to extract the specific code executed by a given input, and use this to improve generation of pseudo-random input to increase likelihood of generating new inputs that trigger unique code paths. Coverage-guided fuzzing has had a significant impact on fuzzing in the last 15 years and is the most common fuzzing technique used in modern software development.
6666

@@ -102,14 +102,14 @@ In order to make the fuzzing work the developer compiles the fuzzing harness and
102102
#include <stdlib.h>
103103
104104
int parseUntrustedBuffer(const uint8_t *buffer, size_t size) {
105-
if (size < 2) {
106-
return -1;
107-
}
108-
if (buffer[0] == 'A') {
109-
if (buffer[1] == 'B') {
110-
assert(0);
111-
}
105+
if (size < 2) {
106+
return -1;
107+
}
108+
if (buffer[0] == 'A') {
109+
if (buffer[1] == 'B') {
110+
assert(0);
112111
}
112+
}
113113
return 0;
114114
}
115115
```
@@ -124,7 +124,7 @@ The question in place for the fuzzer in this case is whether it will come up wit
124124
extern int parseUntrustedBuffer(const uint8_t *buffer, size_t size);
125125
126126
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
127-
parseUntrustedBuffer(data, size);
127+
parseUntrustedBuffer(data, size);
128128
return 0;
129129
}
130130
```
@@ -191,7 +191,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
191191
}
192192
```
193193

194-
ompiling this and launching the fuzzer in a manner similar to Example 1 will result in the binary running forever. In each iteration of the fuzzer it will either print “Size 123” or “Not size 123”, however, by default it will never stop. This can seem counterintuitive at first, partly because it signals that there is no notion of “completeness” when fuzzing, as opposed to testing. This is correct in the sense there is no single truth value denoting if the fuzzing is complete or not, it is by nature an infinite while loop. To this end, a harness is generally run until either one of the conditions hold:
194+
Compiling this and launching the fuzzer in a manner similar to Example 1 will result in the binary running forever. In each iteration of the fuzzer it will either print “Size 123” or “Not size 123”, however, by default it will never stop. This can seem counterintuitive at first, partly because it signals that there is no notion of “completeness” when fuzzing, as opposed to testing. This is correct in the sense there is no single truth value denoting if the fuzzing is complete or not, it is by nature an infinite while loop. To this end, a harness is generally run until either one of the conditions hold:
195195

196196
1. A timeout has been reached;
197197
2. The fuzzer found a bug and, therefore, exits.
@@ -356,7 +356,7 @@ The core task that we have to do in order to use LibFuzzer to fuzz a target appl
356356
#include <stdint.h>
357357
358358
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
359-
/* Fuzz driver implementation */
359+
/* Fuzz driver implementation */
360360
}
361361
```
362362

@@ -834,17 +834,17 @@ We can use the following fuzzer to attack this code:
834834

835835
```c
836836
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size){
837-
char *new_str = (char *)malloc(size+1);
838-
if (new_str == NULL){
839-
return 0;
840-
}
841-
memcpy(new_str, data, size);
842-
new_str[size] = '\0';
843-
844-
attack_me(new_str);
845-
846-
free(new_str);
847-
return 0;
837+
char *new_str = (char *)malloc(size+1);
838+
if (new_str == NULL){
839+
return 0;
840+
}
841+
memcpy(new_str, data, size);
842+
new_str[size] = '\0';
843+
844+
attack_me(new_str);
845+
846+
free(new_str);
847+
return 0;
848848
}
849849
```
850850

@@ -1578,14 +1578,14 @@ The project has two fuzzers `fuzz_complex_parser.c:`
15781578
#include "char_lib.h"
15791579
15801580
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
1581-
char *ns = malloc(size+1);
1582-
memcpy(ns, data, size);
1583-
ns[size] = '\0';
1584-
1585-
count_lowercase_letters(ns);
1586-
1587-
free(ns);
1588-
return 0;
1581+
char *ns = malloc(size+1);
1582+
memcpy(ns, data, size);
1583+
ns[size] = '\0';
1584+
1585+
count_lowercase_letters(ns);
1586+
1587+
free(ns);
1588+
return 0;
15891589
}
15901590
```
15911591

@@ -1600,14 +1600,14 @@ and `fuzz_char_lib.c`
16001600
#include "char_lib.h"
16011601
16021602
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
1603-
char *ns = malloc(size+1);
1604-
memcpy(ns, data, size);
1605-
ns[size] = '\0';
1606-
1607-
parse_complex_format(ns);
1608-
1609-
free(ns);
1610-
return 0;
1603+
char *ns = malloc(size+1);
1604+
memcpy(ns, data, size);
1605+
ns[size] = '\0';
1606+
1607+
parse_complex_format(ns);
1608+
1609+
free(ns);
1610+
return 0;
16111611
}
16121612
```
16131613

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!-- cSpell:ignore warbeast -->
2+
3+
# GitGot: using GitHub repositories as exfiltration store
4+
5+
ReversingLabs identified two npm packages, "warbeast2000" and "kodiak2k" which
6+
were designed to steal SSH keys from developers by exploiting GitHub
7+
repositories _as storage_.
8+
9+
## Impact
10+
11+
> Fortunately, the reach of this campaign was limited. ReversingLabs observed
12+
> different accounts publishing warbeast2000 and kodiak2k on npm. The
13+
> warbeast2000 package was downloaded a little less than 400 times, whereas the
14+
> kodiak2k was downloaded around 950 times.
15+
16+
## Type of compromise
17+
18+
- **Trust and Signing**: This means that in addition to leveraging implicit
19+
trust on `github.com` for pulls, attackers were using Personal Access Tokens
20+
(PATs) to leverage that implicit trust for exfiltration.
21+
22+
## References
23+
24+
- [ReversingLabs Blog](https://www.reversinglabs.com/blog/gitgot-cybercriminals-using-github-to-store-stolen-data)

supply-chain-security/compromises/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ of compromise needs added, please include that as well.
3131
| Name | Year | Type of compromise | Link |
3232
| ----------------- | ------------------ | ------------------ | ----------- |
3333
| [xz backdoor incident](2024/xz.md) | 2024 | Malicious Maintainer | [1](https://cloudsecurityalliance.org/blog/2024/04/25/navigating-the-xz-utils-vulnerability-cve-2024-3094-a-comprehensive-guide) |
34+
| [GitGot: using GitHub repositories as exfiltration store](2024/gitgot.md) | 2024 | Trust and Signing | [1](https://www.reversinglabs.com/blog/gitgot-cybercriminals-using-github-to-store-stolen-data) |
3435
| [ManageEngine xmlsec dependency](2023/xmlsec-manageengine.md) | 2023 | Outdated Dependencies | [1](ttps://flashpoint.io/blog/manageengine-apache-santuario-cve-2022-47966) |
3536
| [Retool Spear Phishing](2023/retool-portal-mfa.md) | 2023 | Dev Tooling | [1](https://www.coindesk.com/business/2023/09/13/phishing-attack-on-cloud-provider-with-fortune-500-clients-led-to-15m-crypto-theft-from-fortress-trust/) |
3637
| [Fake Dependabot commits](2023/fake-dependabot.md) | 2023 | Source Code | [1](https://checkmarx.com/blog/surprise-when-dependabot-contributes-malicious-code/) |

website/Makefile

+49-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,47 @@
11
deps:
2-
rsync -av ../ content/ --include='assessments' --include='governance' --include='governance/related-groups' --include='supply-chain-security' --include='*.md' --exclude='*'
2+
git submodule update --init --recursive # TODO: the hugo theme doesn't need to live in this directory
3+
4+
# Move select content from the root level into the website directory.
5+
rsync -avv ../ root/ \
6+
--include='assessments' --include='assessments/**' \
7+
--include='governance' --include='governance/**' \
8+
--include='publications' --include='publications/**' \
9+
--include='*.md' --exclude='*'
10+
11+
# Move over content such as graphics and logos
312
rsync -av '../design/' 'static/design/' --exclude='#*'
4-
git submodule update --init --recursive
13+
14+
# Update all imported markdown files to work as standalone hugo pages (except READMEs, see below)
15+
# sed command is configured for the Netlify ubuntu env
16+
find root -type f -name '*.md' | while IFS= read -r file; do \
17+
base_name=$$(basename "$$file" .md); \
18+
if [ "$$file" = "/_index.md" -o "$$base_name" = "README" ]; then \
19+
continue; \
20+
fi; \
21+
text_to_prepend="---\ntitle: \"$$base_name\"\n---\n"; \
22+
sed -i "1s/^/$$text_to_prepend/" "$$file"; \
23+
done
24+
25+
# Set up Navbar and Sidebar contents
26+
# Add top level dirs to the navbar
27+
# Add all subdirectories to the sidebar
28+
# If a README is in the dir, copy its contents to the front page for that dir
29+
find root -type d -exec sh -c '\
30+
base_title=$$(basename "$$1"); \
31+
spaced_title=$$(echo "$$base_title" | sed "s/-/ /g" | tr "[:lower:]" "[:upper:]"); \
32+
title=$$(echo "$$spaced_title" | awk "{for(i=1; i<=NF; i++) \$$i = toupper(substr(\$$i, 1, 1)) tolower(substr(\$$i, 2)); print}"); \
33+
if [ $$1 = "root/$$base_title" ]; then \
34+
echo "---\ntitle: $$title\nmenu:\n main:\n weight: 20\n---" > "$$1/_index.md"; \
35+
else \
36+
echo "---\ntitle: $$title\n---" > "$$1/_index.md"; \
37+
fi; \
38+
echo "{{< include-markdown \"$$1/README.md\" >}}" >> "$$1/_index.md"; \
39+
' sh {} \;
40+
41+
# Move everything but README files over to content dir
42+
# This excludes READMEs to avoid them being duplicated on the sidebar
43+
# Exclude any _index files that need customized in the `website/` in this rsync to avoid autogen overwrite
44+
rsync -avv --exclude='README.md' --exclude='/_index.md' root/ content/
545

646
serve: deps
747
hugo server \
@@ -28,4 +68,10 @@ preview-build: deps
2868
--buildDrafts \
2969
--buildFuture \
3070
--minify
31-
npx -y pagefind --site public
71+
npx -y pagefind --site public
72+
73+
clean:
74+
@git clean -f .
75+
@rm -rf public resource
76+
@find root/* -type f ! -name '*.gitkeep' -print0 | xargs -0 rm -v
77+
@echo "Finished removing anything residual"

website/content/_index.md

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
---
22
---
3-
4-
# Security Technical Advisory Group
5-
6-
{{< include-markdown "content/README.md" "false" >}}
3+
<!-- markdownlint-disable-file MD041 -->
4+
{{< include-markdown "root/README.md" >}}

website/content/about/_index.md

-9
This file was deleted.

website/content/about/faq.md

-4
This file was deleted.

website/content/about/projects.md

-4
This file was deleted.

website/content/assessments/_index.md

-9
This file was deleted.

website/content/assessments/assessment-1.md

-5
This file was deleted.

website/content/contributing/_index.md

-8
This file was deleted.

0 commit comments

Comments
 (0)