
_ _
_ _ ___| | | _____ __
| | | |/ _ \ | |/ _ \ \ /\ / /
| |_| | __/ | | (_) \ V V /
\__, |\___|_|_|\___/ \_/\_/
|___/
- Just add blue.
تعديلات بسيطة على الملفات الثنائية تؤدي إلى تفعيل canarytoken عند تنفيذ ملف ثنائي.
مثالية لتفخيخ أنظمة الإنتاج ضد المهاجمين.
توجد حالياً أربع طرق:
سجّل توكن canary من نوع DNS خاصاً بك على canarytokens. يمكنك قراءة المزيد حول طريقة عمله في الوثائق.
سيبدو شيئاً كهذا: pz21qtyfsidipvrsuzs9n2udi.canarytokens.com
ضعه في متغير البيئة TOKEN باستخدام:
export TOKEN="c28y9l4dw0drj62un0cm4rwz6.canarytokens.com"
تحتوي ملفات Dockerfiles على توكن مثال صالح، ويمكنك الاطلاع على سجل نشاطه هنا. لكن يُنصح بشدة باستخدام توكن خاص بك.
تتوفر ملفات Dockerfiles تنفّذ كل طريقة من طرق البناء هذه.
إذا كان لديك بيئة بناء افتراضية مناسبة (مثل build-essential على الأنظمة المبنية على دبيان أو build-base على الأنظمة المبنية على Alpine)، يمكنك ترجمة libyellow أو yellow ببساطة شديدة. أما ldsoyellow فهو أكثر تعقيداً.
يمكنك رؤية مثال بسيط متكامل لبناء وتثبيت yellow في Dockerfiles.
gcc -o yellow yellow.c canary32.c
انظر Dockerfile.yellow
لا يتطلب أي بناء.
تأكد من تحديث قائمة الملفات الثنائية التي تريد التنبيه عليها في مصفوفة alert_list.
gcc -shared -fPIC libyellow.c canary32.c -o libyellow.so
انظر Dockerfile.libyellow أو Dockerfile.libyellow.debian لإصدارات Alpine وDebian.
اطّلع على Dockerfile.ldsoyellow للحصول على مثال عملي. ستحتاج إلى مصادر glibc (أنصح باستخدام إصدار الحزمة الرسمي لتكون أقرب ما يمكن إلى الرابط الحقيقي).
apt-get source libc6
طبّق التصحيح rtld.c.patch
cd /glibc-*
patch < rtld.c.patch
قم بتهيئة glibc مع تعطيل فحوصات السلامة وجعله يشير إلى مجلد libdir الصحيح (بافتراض نظام 64 بت)
mkdir glibcbuild && cd glibcbuild
/glibc-*/configure --disable-sanity-checks --libdir=$(dirname $(find / -name "libc.so.6"|grep 64))
قم بالبناء كالمعتاد
make
تستخدم جميع النسخ متغير البيئة TOKEN لتحديد عنوان URL الخاص بتوكن canary. يمكن تغيير اسم متغير البيئة أو حتى ترميزه بشكل ثابت إذا فضّلت ذلك. ومرة أخرى، توجد ملفات Dockerfiles لكل من هذه النسخ.
صُمم yellow للتفعيل على ملفات ثنائية محددة تقوم بإعادة تسميتها وإنشاء اسم مستعار لها، تماماً مثل طريقة استخدام busybox. ستحتاج إلى إعادة تسمية الملف الثنائي لاستخدام الامتداد ".canary"، ثم إنشاء رابط رمزي (أو نسخة) من yellow بالاسم الأصلي للملف الثنائي. على سبيل المثال:
cp yellow /usr/bin
mv /usr/bin/id /usr/bin/id.canary
ln -s /usr/bin/yellow /usr/bin/id
بعد ذلك، أي تنفيذ لـ id سيؤدي إلى تفعيل توكن canary الخاص بك.
انظر Dockerfile.yellow
تستخدم طريقة تنفيذ العمليات الحساسة نفس التقنية المذكورة أعلاه، إلا أنها تُفعَّل عبر سكربت شل بدلاً من ملف ثنائي، وتأتي مع مثبّت. شغّل spe_install.sh مع تمرير توكن DNS واسم الملف الثنائي الذي تريد التفعيل عليه. لا يلزم أن يكون الملف الثنائي موجوداً.
على سبيل المثال:
./spe_install.sh "c28y9l4dw0drj62un0cm4rwz6.canarytokens.com" /bin/id
سيُنشئ تنبيهاً في أي وقت يتم فيه تشغيل id.
هذه نسخة من طريقة توكن Windows الموضحة هنا
صُمم libyellow للتفعيل على أي ملف ثنائي يُستخدم عند حقنه عبر LD_PRELOAD، لكنه ينبّه فقط على الملفات التي تحددها في الكود. يمكن القيام بذلك لكل جلسة عن طريق تعيين متغير البيئة LD_PRELOAD للإشارة إليه، أو على مستوى النظام بأكمله بإضافته إلى ملف /etc/ld.so.preload. الطريقة الأخيرة قد تعطّل نظامك إذا كانت المكتبة لا تعمل عليه، لذلك يُنصح باختباره باستخدام LD_PRELOAD أولاً.
تذكّر وضع التوكن الخاص بك في متغير البيئة TOKEN كما هو موضح في قسم "العمل التحضيري" أعلاه.
مثال على LD_PRELOAD:
cp libyellow.so /usr/lib/
export LD_PRELOAD=/usr/lib/libyellow.so
ثم شغّل ملفاً ثنائياً مستهدفاً، وتأكد من أنه يتصرف كما هو متوقع، وستحصل على تنبيه canary.
بمجرد التأكد من أن كل شيء يعمل، يمكنك إضافته على مستوى النظام باستخدام (لن يعمل هذا على الأنظمة المبنية على musl مثل Alpine، حيث تُستخدم طريقة LD_PRELOAD بدلاً من ذلك):
cp libyellow.so /usr/lib
echo /usr/lib/libyellow.so >> /etc/ld.so.preload
انظر Dockerfile.libyellow أو Dockerfile.libyellow.debian لإصدارات Alpine وDebian.
صُمم ldsoyellow للتفعيل على ملفات ثنائية محددة يتم تعديلها لاستخدامه بدلاً من الرابط الافتراضي. يمكنك استبدال الرابط الافتراضي به للحصول على تأثير على مستوى النظام بأكمله، ولكن ذلك سيكون على الأرجح مزعجاً للغاية.
يتضمن مثال Dockerfile.ldsoyellow القيام بذلك على /bin/cat. أولاً، يتم نسخ الرابط المفخَّخ بجوار الرابط الشرعي:
cp <arm'd linker> /lib64/ld-linux-x86-64.so.3
ثم يتم تعديل الملف الثنائي لاستخدامه بدلاً من الرابط الشرعي:
sed -i "s/\/lib64\/ld-linux-x86-64.so.2/\/lib64\/ld-linux-x86-64.so.3/" /bin/cat
انظر Dockerfile.ldsoyellow.
إذا أردت تشغيل Docker داخل Docker، على سبيل المثال، في بيئة بناء يكون لديك فيها تحكم محدود بتوجيهات البناء، وتريد أن يتم تنبيهك إذا اخترق أحدهم البيئة، يمكنك القيام بشيء مشابه للمثال الموجود في Dockerfile.dind-rootless. يستخدم هذا المثال yellow لكنه قد يستخدم أي نسخة أخرى أو جميعها.
يقوم بتفخيخ الملفات الثنائية الموجودة على المضيف والتي لا ينبغي أن تكون قابلة للوصول من داخل حاوية.