
# CVE-2021-21423 (GHSA-gg2g-m5wc-vccq) 재현을 위한 공인 보안 연구 랩: issue_comment를 통한 projen rebuild-bot pwn 요청
자동화된 연구 산출물 — 업스트림 프로젝트가 아님.
이 저장소는 Université Laval의 석사 논문을 위해 자동화된 하네스가 구축한 일회용 실험실로, 공개된 GitHub Actions 워크플로우 취약점을 재현하기 위한 것입니다. 이는 커밋
284d9162b9903c1828aa13ab56420c1183c49d40(2021-03-09) 시점의projen/projen의 축어적 스냅샷이며, 해당 프로젝트의 자체 라이선스에 따라 재배포되며, 그 라이선스 파일은 이 스냅샷에 변경 없이 포함되어 있습니다.업스트림 프로젝트는 관여하지 않으며, 결코 공격 대상이 아니고, 여기서 연구된 취약점은 이미 공개된 것입니다. 이 저장소의 모든 시크릿과 변수는 무작위로 생성된 더미 값입니다 — 실제 자격 증명은 존재하지 않습니다. 액션 참조와 러너 이미지는 2021-03-09에 확인된 값으로 고정되어 있습니다. 스냅샷에 적용된 모든 변경 사항은 하네스 출력의
pinning.md를 참조하세요.질문 또는 이의 제기: [email protected]
복잡한 프로젝트 구성을 코드를 통해 정의하고 유지 관리합니다.
#TemplatesAreEvil 운동에 동참하세요!
projen은 JavaScript로 작성된 잘 타입이 정의된 정의에서 package.json,
tsconfig.json, .gitignore, GitHub Workflows, eslint, jest 등의 프로젝트 구성 파일을 합성합니다.
projen에 대한 이 강연을 확인해 보세요.
기존의 템플릿/스캐폴딩 도구와 달리 projen은 일회성 생성기가 아닙니다. 합성된 파일은 수동으로 편집해서는 안 됩니다 (실제로 projen이 이를 강제합니다). 프로젝트 설정을 수정하려면 사용자는 풍부한 강력한 타입의 클래스를 사용하여 상호작용하고 projen을 실행하여 프로젝트 구성 파일을 업데이트합니다.
새 프로젝트를 만들려면 다음 명령을 실행하고 지침을 따르세요:```console $ mkdir my-project $ cd my-project $ git init $ npx projen new PROJECT-TYPE 🤖 Synthesizing project... ...
현재 지원되는 프로젝트 유형(`npx projen new`에 유형 없이 실행하면 목록이 표시됨):
<!-- <macro exec="node ./scripts/readme-projects.js"> -->
* [awscdk-app-ts](https://github.com/projen/projen/blob/master/API.md#projen-awscdktypescriptapp) - TypeScript로 작성된 AWS CDK 앱.
* [awscdk-construct](https://github.com/projen/projen/blob/master/API.md#projen-awscdkconstructlibrary) - AWS CDK construct 라이브러리 프로젝트.
* [cdk8s-construct](https://github.com/projen/projen/blob/master/API.md#projen-constructlibrarycdk8s) - CDK8s construct 라이브러리 프로젝트.
* [java](https://github.com/projen/projen/blob/master/API.md#projen-java.javaproject) - Java 프로젝트.
* [jsii](https://github.com/projen/projen/blob/master/API.md#projen-jsiiproject) - 다중 언어 jsii 라이브러리 프로젝트.
* [nextjs](https://github.com/projen/projen/blob/master/API.md#projen-web.nextjsproject) - TypeScript 없이 구성된 Next.js 프로젝트.
* [nextjs-ts](https://github.com/projen/projen/blob/master/API.md#projen-web.nextjstypescriptproject) - TypeScript로 구성된 Next.js 프로젝트.
* [node](https://github.com/projen/projen/blob/master/API.md#projen-nodeproject) - Node.js 프로젝트.
* [project](https://github.com/projen/projen/blob/master/API.md#projen-project) - 기본 프로젝트.
* [python](https://github.com/projen/projen/blob/master/API.md#projen-python.pythonproject) - Python 프로젝트.
* [react](https://github.com/projen/projen/blob/master/API.md#projen-web.reactproject) - TypeScript 없이 구성된 React 프로젝트.
* [react-ts](https://github.com/projen/projen/blob/master/API.md#projen-web.reacttypescriptproject) - TypeScript로 구성된 React 프로젝트.
* [typescript](https://github.com/projen/projen/blob/master/API.md#projen-typescriptproject) - TypeScript 프로젝트.
* [typescript-app](https://github.com/projen/projen/blob/master/API.md#projen-typescriptappproject) - TypeScript 앱.
<!-- </macro> -->
> `npx projen new PROJECT-TYPE --help`를 사용하면 부트스트래핑 중에 대부분의 프로젝트 옵션을 지정할 수 있는 명령줄 스위치 목록을 볼 수 있습니다.
> 예: `npx projen new jsii --author-name "Jerry Berry"`.
`new` 명령은 `jsii` 프로젝트의 경우 다음과 같은 `.projenrc.js` 파일을 생성합니다:```js
const { JsiiProject } = require('projen');
const project = new JsiiProject({
authorAddress: "[email protected]",
authorName: "Elad Ben-Israel",
name: "foobar",
repository: "https://github.com/eladn/foobar.git",
});
project.synth();
이 프로그램은 최소한의 설정으로 프로젝트 유형을 인스턴스화한 다음
synth()를 호출하여 프로젝트 파일을 합성합니다. 기본적으로 new 명령은
이 프로그램도 실행하므로 완전히 작동하는 프로젝트가 생성됩니다.
프로젝트가 생성되면 .projenrc.js를 편집하고 npx projen을 다시 실행하여
다시 합성함으로써 프로젝트를 구성할 수 있습니다.
_projen_이 생성한 파일은 "구현 세부 사항"으로 간주되며 _projen_은 수동 편집으로부터 이 파일들을 보호합니다(대부분의 파일은 읽기 전용으로 표시되며, CI 빌드 워크플로우에 "변조 방지" 검사가 구성되어 빌드 중 파일이 업데이트되지 않도록 보장합니다).
예를 들어, jsii 프로젝트에서 PyPI 게시를 설정하려면
python option을 사용할 수 있습니다:```js
const project = new JsiiProject({
// ...
python: {
distName: "mydist",
module: "my_module",
}
});
Run:```shell
npx projen
그리고 package.json 파일의 jsii 설정에 python 섹션이 추가되고, GitHub release.yml 워크플로우에 PyPI 게시 단계가 포함된 것을 확인할 수 있을 것입니다.
이 내용을 셸 프로필에 추가해 두는 것을 권장합니다. 그러면 .projenrc.js를 업데이트할 때마다 간단히 pj만 실행하면 됩니다:```bash
alias pj='npx projen'
Most projects support a `start` command which displays a menu of workflow
activities:```shell
$ yarn start
? Scripts: (Use arrow keys)
BUILD
❯ compile Only compile
watch Watch & compile in the background
build Full release build (test+compile)
TEST
test Run tests
test:watch Run jest in watch mode
eslint Runs eslint against the codebase
...
build 명령은 CI 빌드에서 실행되는 것과 동일한 명령입니다. 일반적으로 모듈을 배포용으로 컴파일, 린트, 테스트 및 패키징합니다.
프로젝트 유형에 내장된 기능의 몇 가지 예:
package.json 완전 합성compile, build, test, package 같은 표준 npm 스크립트API 세부 사항은 API 참조를 참조하세요.
또한 여러 projen 구성 요소와 프로젝트 유형이 /docs에 예제와 함께 설명되어 있습니다(현재 작업 진행 중입니다!).
_projen_은 "배터리 포함" 방식을 채택하여 수십 가지의 다양한 프로젝트 유형을 기본 제공하는 것을 목표로 합니다(이제 막 시작했습니다). projen new react, projen new angular, projen new java-maven, projen new awscdk-typescript, projen new cdk8s-python을 생각해 보세요(projen의 어떤 것도 javascript나 npm에 묶여 있지 않습니다!)...
새 프로젝트 유형을 추가하는 것은 이 저장소에 풀 리퀘스트를 제출하고 projen.Project(또는 그 파생 클래스 중 하나)를 확장하는 클래스를 내보내는 것만큼 간단합니다. Projen은 프로젝트 유형을 자동으로 발견하므로 여러분의 유형은 projen new에서 즉시 사용할 수 있습니다.
_projen_은 많은 프로젝트 유형을 기본 제공하지만, 외부 jsii 모듈에 정의된 프로젝트 유형 및 구성 요소와도 작동할 수 있습니다(jsii가 필요한 이유는 projen이 jsii 메타데이터를 사용하여 projen new에서 프로젝트 유형과 옵션을 발견하기 때문입니다).
npm에 projen-vuejs라는 모듈이 있고 여기에 vue.js용 단일 프로젝트 유형이 포함되어 있다고 가정해 보겠습니다:```bash
$ npx projen new --from projen-vuejs
참조된 모듈에 여러 프로젝트 유형이 포함된 경우 유형이 필수입니다.
스위치를 사용하여 프로젝트 유형 API를 기반으로 초기 값을 지정할 수도 있습니다.
또한 [yarn add](https://classic.yarnpkg.com/en/docs/cli/add#toc-adding-dependencies)에서 지원하는 모든 패키지 구문을 사용할 수 있습니다. 예를 들어
`[email protected]`, `file:/path/to/local/folder`,
`[email protected]/awesome/projen-vuejs#1.2.3` 등이 있습니다.```bash
$ npx projen new --from projen-vuejs@^2 vuejs-ts --description "my awesome vue project"
내부적으로 projen new는 npm에서 projen-vuejs 모듈(버전 2.0.0 이상)을 설치하고, 그 안의 프로젝트 유형을 탐색한 다음 vuejs-ts 프로젝트 유형을 부트스트랩합니다. description 필드에는 "my awesome vue project" 값이 할당됩니다. .projenrc.js 파일을 살펴보면 projen-vuejs가 dev dependency로 정의되어 있는 것을 확인할 수 있습니다:```javascript
const { VueJsProject } = require('projen-vuejs');
const project = new VueJsProject({ name: 'my-vuejs-sample', description: "my awesome vue project", // ... devDeps: [ 'projen-vuejs' ] });
project.synth();
## 로드맵
[비전](https://github.com/pvharmo2/gha-lab-b9842b12c0/blob/main/VISION.md)을 참조하세요.
## 기여
모든 종류의 기여를 환영합니다! [기여자 가이드](https://github.com/pvharmo2/gha-lab-b9842b12c0/blob/main/CONTRIBUTING.md)와 [행동 강령](https://github.com/pvharmo2/gha-lab-b9842b12c0/blob/main/CODE_OF_CONDUCT.md)을 확인해 주세요.
빠른 시작을 위해 개발 환경을 확인해 보세요:```bash
$ git clone [email protected]:projen/projen
$ cd projen
$ yarn
$ yarn watch # compile in the background
감사합니다. 이 멋진 분들께 감사드립니다 (이모지 키):
Apache-2.0 라이선스에 따라 배포됩니다.

![]() Josh Kellendonk 💻 |
![]() andrestone 💻 | ![]() Cristian Pallarés 💻 | ![]() Jonathan Goldwasser 💻 | ![]() Matthew Bonig 💻 | ![]() Pahud Hsieh 💻 | ![]() Adam Elmore 💻 | ![]() Ash 💻 |
![]() Jacob 💻 | ![]() Kraig Amador 💻 | ![]() Martin Muller 💻 | ![]() Tomasz Łakomy 💻 | ![]() john-tipper 💻 | ![]() Henry Sachs 💻 | ![]() Joseph Egan 💻 |
![]() Sebastian Korfmann 💻 | ![]() Bart Callant 💻 | ![]() Campion Fellin 💻 | ![]() Grady Barrett 💻 | ![]() Hassan Mahmud 💻 | ![]() Hassan Mahmud 💻 | ![]() Jake Pearson 💻 |
![]() Jeremy Jonas 💻 | ![]() Matt Martz 💻 | ![]() Max Körlinge 💻 | ![]() Neil Kuan 💻 | ![]() Rafal Wilinski 💻 | ![]() Romain Marcadier 💻 | ![]() Thomas Klinger 💻 |
![]() Tobias 💻 | ![]() flyingImer 💻 |