
مختبر أبحاث أمني مُصرَّح به لإعادة إنتاج CVE-2021-21423 (GHSA-gg2g-m5wc-vccq): طلب pwn الخاص بـ projen rebuild-bot عبر issue_comment
أداة بحث آلية — ليست المشروع الأصلي (upstream).
هذا المستودع عبارة عن بيئة مختبرية مؤقتة (disposable lab) أُنشئت بواسطة نظام آلي (automated harness) لأطروحة ماجستير في جامعة لافال (Université Laval) حول إعادة إنتاج ثغرات سير عمل GitHub Actions المنشورة. وهو لقطة حرفية (verbatim snapshot) من
projen/projenعند الالتزام (commit)284d9162b9903c1828aa13ab56420c1183c49d40(2021-03-09)، مُعاد توزيعه بموجب ترخيص ذلك المشروع نفسه، الذي تم تضمين ملفه دون تغيير في هذه اللقطة.المشروع الأصلي (upstream) ليس مشاركًا، ولا يُستهدف أبدًا، والثغرة المدروسة هنا معلنة بالفعل. كل سر (secret) ومتغير في هذا المستودع هو قيمة وهمية مولّدة عشوائيًا — لا توجد أي بيانات اعتماد حقيقية. مراجع الإجراءات (Action references) وصور المشغّل (runner images) مثبتة على ما كانت تُحل إليه في 2021-03-09؛ راجع
pinning.mdفي مخرجات النظام الآلي لمعرفة كل تغيير أُجري على اللقطة.الأسئلة أو الاعتراضات: [email protected]
عرّف وحافظ على إعدادات المشاريع المعقدة من خلال الكود.
انضم إلى حركة #TemplatesAreEvil!
projen يولّد ملفات إعدادات المشروع مثل package.json،
tsconfig.json، .gitignore، سير عمل GitHub، eslint، jest، وغيرها من
تعريف مكتوب جيدًا (well-typed) بلغة JavaScript.
اطّلع على هذه المحاضرة حول projen.
على عكس أدوات القوالب/السقالات (templating/scaffolding) الحالية، projen ليس مولّدًا لمرة واحدة.
الملفات المُولَّدة لا ينبغي أبدًا تحريرها يدويًا (في الواقع، يفرض projen ذلك). لتعديل إعداد مشروعك، يتفاعل المستخدمون مع فئات غنية ومكتوبة بقوة (strongly-typed) وينفّذون 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) - تطبيق AWS CDK بلغة TypeScript.
* [awscdk-construct](https://github.com/projen/projen/blob/master/API.md#projen-awscdkconstructlibrary) - مشروع مكتبة بنية AWS CDK.
* [cdk8s-construct](https://github.com/projen/projen/blob/master/API.md#projen-constructlibrarycdk8s) - مشروع مكتبة بنية CDK8s.
* [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) - مشروع Next.js بدون TypeScript.
* [nextjs-ts](https://github.com/projen/projen/blob/master/API.md#projen-web.nextjstypescriptproject) - مشروع Next.js مع TypeScript.
* [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) - مشروع React بدون TypeScript.
* [react-ts](https://github.com/projen/projen/blob/master/API.md#projen-web.reacttypescriptproject) - مشروع React مع TypeScript.
* [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` ملف `.projenrc.js` يبدو هكذا لمشاريع `jsii`:```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 لضمان عدم تحديث الملفات أثناء البناء).
على سبيل المثال، لإعداد نشر PyPI في مشاريع jsii، يمكنك استخدام
خيار python:```js
const project = new JsiiProject({
// ...
python: {
distName: "mydist",
module: "my_module",
}
});
قم بتشغيل:```shell
npx projen
وستلاحظ أن ملف package.json الخاص بك يحتوي الآن على قسم python ضمن إعداد jsii الخاص به، كما يتضمن سير عمل GitHub release.yml خطوة نشر إلى PyPI.
نوصي بوضع هذا في ملف تعريف الصدفة (shell profile) لديك، بحيث يمكنك ببساطة تشغيل pj في كل مرة تقوم فيها بتحديث .projenrc.js:```bash
alias pj='npx projen'
معظم المشاريع تدعم أمر `start` الذي يعرض قائمة بأنشطة سير العمل:```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راجع مرجع 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!)...