Skip to content

Commit 9167688

Browse files
authored
Merge branch 'main' into zero-trust-whitepaper
2 parents db10d23 + 8af95f1 commit 9167688

28 files changed

+311
-158
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)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<!-- cSpell:ignore sophos -->
2+
3+
# Exploitation of Digital Signing Certificates in Malware Distribution
4+
5+
In early 2024, a suspicious 3proxy sample was identified, signed with a
6+
Microsoft Windows Hardware Compatibility certificate. This sample, submitted
7+
by "Hainan YouHu Technology Co. Ltd," disguised as a setup file for an Android
8+
screen-sharing app (LaiXi), turned out to be malware. The discovery prompted
9+
further investigations, revealing other samples with similar characteristics,
10+
leading to a suspicion that a software supply chain attack had been conducted
11+
on the publishing party:
12+
13+
> We have no evidence to suggest that the LaiXi developers deliberately
14+
> embedded the malicious file into their product, or that a threat actor
15+
> conducted a supply chain attack to insert it into the compilation/building
16+
> process of the LaiXi application. However, we will note that given the links
17+
> between LaiXi and the malicious backdoor we investigated – and the length of
18+
> time those links have existed (since at least January 2023, as we’ll discuss
19+
> shortly) – users should exercise extreme caution when it comes to
20+
> downloading, installing, and using LaiXi.
21+
22+
## Impact
23+
24+
The malware exploits the trust placed in digitally signed certificates, allowing
25+
it to bypass security systems that automatically trust signed files. This misuse
26+
of digital signing undermines the integrity of certificate-based security systems
27+
and highlights vulnerabilities in the certificate issuing and validation process.
28+
29+
## Type of Compromise
30+
31+
- **Trust and Signing:** The incident involved the misuse of legitimate digital
32+
signing certificates to authenticate malicious software, tricking systems and
33+
users by presenting the malware as trustworthy.
34+
35+
## References
36+
37+
- [Sophos Report](https://news.sophos.com/en-us/2024/04/09/smoke-and-screen-mirrors-a-strange-signed-backdoor/)
38+
- [Stairwell Analysis](https://stairwell.com/resources/signed-sealed-but-not-always-secure-rethinking-trust-in-digitally-signed-certificates/)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Malware Disguised as Official Installer Used to Target Korean Public Institution
2+
3+
## Detailed Account
4+
5+
The Kimsuky group targeted a Korean public institution by distributing malware
6+
disguised as an official installer. This malicious dropper, signed with a valid
7+
certificate from a Korean company, was designed to look like a legitimate
8+
application. When executed, it installed a backdoor named Endoor, capable of
9+
receiving commands and executing malicious activities such as taking
10+
screenshots and stealing credentials.
11+
12+
## Impact
13+
14+
The security researchers identified instances of this installer used in chained
15+
attacks.
16+
17+
## Type of Compromise
18+
19+
- **Trust and Signing**: The incident exploits trusted digital certificates to
20+
deploy malware, undermining the security mechanisms that rely on certificate
21+
validity.
22+
23+
## References
24+
25+
- [AhnLab Security Report](https://asec.ahnlab.com/en/63396/)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<!-- cspell:ignore pkgsrc -->
2+
3+
# Malicious maintainer introduces sophisticated backdoor in xz
4+
5+
A backdoor was introduced in `xz`, a compression tool integral to various
6+
Linux distributions. Over the course of several years, a malicious actor
7+
or actors attained maintainer status and implanted a sophisticated,
8+
multi-stage backdoor that relied on the specific build processes of `xz`
9+
to activate, resulting in a modified `liblzma` library that can be used
10+
by any software linked against this library.
11+
12+
## Impact
13+
14+
The backdoor was discovered on March 28, 2024, specifically in versions
15+
5.6.0 and 5.6.1 of the XZ Utils package, and was assigned CVE-2024-3094.
16+
17+
The compromised package was distributed across several Linux distributions
18+
including Fedora, Debian, Kali Linux, openSUSE, Arch Linux, and various
19+
package managers like Homebrew and pkgsrc.
20+
21+
The apparent goal of this backdoor was to enable remote code execution
22+
via `sshd` on affected systems by intercepting the `RSA_public_decrypt()`
23+
function, looking for an attacker controlled key, and executing the payload
24+
via `system()` function.
25+
26+
This incident achieved mainstream media coverage, driving further recognition
27+
of the threats involved in exploiting trust and lack of visibility into
28+
maintainer activities.
29+
30+
The initial response guidance involved rolling back the version of `xz`,
31+
but this proved difficult in some ecosystems which had to intervene to
32+
create epochs. Also, for a number of days after the disclosure, the `xz`
33+
repository on GitHub was disabled which made it more cumbersome for the
34+
public to research what had happened.
35+
36+
## Type of compromise
37+
38+
While rooted on a malicious maintainer that attained this status by a
39+
long-term effort by an actor or actors to subvert the project, this incident
40+
also exhibits some attack chaining characteristics including the exploitation
41+
of trusted build and distribution mechanisms to deploy the backdoor. From
42+
the [Cloud Security Alliance](https://cloudsecurityalliance.org/blog/2024/04/25/navigating-the-xz-utils-vulnerability-cve-2024-3094-a-comprehensive-guide)
43+
report:
44+
45+
> The backdoor was deliberately concealed by the developer. It gets incorporated
46+
into the binary during the RPM or DEB packaging process for x86-64 architecture,
47+
using gcc and gnu linker, under the guise of a "test" step.
48+
49+
## References
50+
51+
- <https://myrror.security/the-xz-attack-a-software-supply-chain-earthquake/>
52+
- <https://securitylabs.datadoghq.com/articles/xz-backdoor-cve-2024-3094/>
53+
- <https://securelist.com/xz-backdoor-story-part-1/112354/>
54+
- <https://medium.com/checkmarx-security/backdoor-in-xz-impacting-multiple-linux-distros-074e86989725>
55+
- <https://cloudsecurityalliance.org/blog/2024/04/25/navigating-the-xz-utils-vulnerability-cve-2024-3094-a-comprehensive-guide>

0 commit comments

Comments
 (0)