
# لقطة من الكود المصدري لنواة لينكس 4.1.15 لتحليل ودراسة CVE-2022-3564، وهي ثغرة أمنية في النظام الفرعي للشبكات في النواة.
Linux kernel release 4.x http://kernel.org/
هذه هي ملاحظات الإصدار لنواة لينكس الإصدار 4. اقرأها بعناية، لأنها تخبرك عن ماهية هذا الأمر، وتشرح كيفية تثبيت النواة، وماذا تفعل إذا حدث خطأ ما.
ما هو لينكس؟
لينكس هو نسخة طبق الأصل من نظام التشغيل يونكس، مكتوب من الصفر بواسطة لينوس تورفالدس بمساعدة فريق غير منظم من المخترقين عبر الإنترنت. يهدف إلى الامتثال لـ POSIX ومواصفات UNIX الموحدة.
يحتوي على جميع الميزات التي تتوقعها في نظام يونكس حديث متكامل، بما في ذلك تعدد المهام الحقيقي، الذاكرة الافتراضية، المكتبات المشتركة، التحميل عند الطلب، الملفات التنفيذية المشتركة للنسخ عند الكتابة، إدارة الذاكرة السليمة، والشبكات متعددة الأكوام بما في ذلك IPv4 و IPv6.
يتم توزيعه بموجب رخصة جنو العمومية العامة - راجع الملف COPYING المرفق لمزيد من التفاصيل.
على أي أجهزة يعمل؟
على الرغم من تطويره في البداية لأجهزة الكمبيوتر الشخصية 32 بت القائمة على معمارية x86 (386 أو أعلى)، فإن لينكس اليوم يعمل أيضًا (على الأقل) على معماريات Compaq Alpha AXP، Sun SPARC و UltraSPARC، Motorola 68000، PowerPC، PowerPC64، ARM، Hitachi SuperH، Cell، IBM S/390، MIPS، HP PA-RISC، Intel IA-64، DEC VAX، AMD x86-64، AXIS CRIS، Xtensa، Tilera TILE، AVR32 و Renesas M32R.
يمكن نقل لينكس بسهولة إلى معظم المعماريات العامة 32 أو 64 بت طالما أنها تحتوي على وحدة إدارة ذاكرة مقسمة (PMMU) ونقل من مترجم GNU C (gcc) (جزء من مجموعة مترجمات GNU، GCC). كما تم نقل لينكس إلى عدد من المعماريات دون PMMU، على الرغم من أن الوظائف تكون محدودة بشكل واضح. تم أيضًا نقل لينكس إلى نفسه. يمكنك الآن تشغيل النواة كتطبيق في مساحة المستخدم - وهذا ما يسمى لينكس وضع المستخدم (UML).
الوثائق:
هناك الكثير من الوثائق المتاحة سواء في شكل إلكتروني على الإنترنت أو في الكتب، سواء كانت خاصة بلينكس أو تتعلق بأسئلة عامة حول يونكس. أوصي بالاطلاع على الأدلة الفرعية للوثائق على أي موقع FTP للينكس للحصول على كتب LDP (مشروع توثيق لينكس). هذا الملف README ليس المقصود منه أن يكون وثائق للنظام: فهناك مصادر أفضل بكثير متاحة.
توجد ملفات README متنوعة في الدليل الفرعي Documentation/: تحتوي هذه عادةً على ملاحظات تثبيت خاصة بالنواة لبعض برامج التشغيل على سبيل المثال. راجع Documentation/00-INDEX للحصول على قائمة بما هو موجود في كل ملف. يرجى قراءة ملف Changes، لأنه يحتوي على معلومات حول المشكلات التي قد تنتج عن ترقية النواة الخاصة بك.
الدليل الفرعي Documentation/DocBook/ يحتوي على عدة أدلة إرشادية لمطوري ومستخدمي النواة. يمكن تقديم هذه الأدلة بعدة تنسيقات: PostScript (.ps)، PDF، HTML، وصفحات الدليل (man-pages)، من بين أخرى. بعد التثبيت، "make psdocs"، "make pdfdocs"، "make htmldocs"، أو "make mandocs" ستقوم بعرض الوثائق بالتنسيق المطلوب.
تثبيت مصدر النواة:
إذا قمت بتثبيت المصادر الكاملة، ضع ملف النواة المضغوط (tarball) في دليل لديك صلاحيات فيه (مثل دليل منزلك) وقم بفك ضغطه:
xz -cd linux-4.X.tar.xz | tar xvf -
استبدل "X" برقم إصدار أحدث نواة.
لا تستخدم المنطقة /usr/src/linux/! هذه المنطقة تحتوي على مجموعة (عادة غير كاملة) من رؤوس النواة التي تستخدمها ملفات رأس المكتبات. يجب أن تتطابق مع المكتبة، ولا تتشوش بأي شيء يحدث ليكون نواة اليوم.
يمكنك أيضًا الترقية بين إصدارات 4.x عن طريق التصحيح (patching). يتم توزيع التصحيحات بتنسيق xz. للتثبيت عن طريق التصحيح، احصل على جميع ملفات التصحيح الأحدث، وادخل إلى الدليل الأعلى لمصدر النواة (linux-4.X) ونفذ:
xz -cd ../patch-4.x.xz | patch -p1
استبدل "x" لجميع الإصدارات الأكبر من الإصدار "X" لشجرة المصادر الحالية، بالترتيب، ويجب أن تكون الأمور على ما يرام. قد ترغب في إزالة ملفات النسخ الاحتياطي (some-file-name~ أو some-file-name.orig)، وتأكد من عدم وجود تصحيحات فاشلة (some-file-name# أو some-file-name.rej). إذا كانت موجودة، فقد أخطأت أنا أو أنت.
على عكس تصحيحات نواة 4.x، فإن تصحيحات نواة 4.x.y (المعروفة أيضًا بنواة -stable) ليست تراكمية بل تطبق مباشرة على النواة الأساسية 4.x. على سبيل المثال، إذا كانت نواتك الأساسية هي 4.0 وتريد تطبيق تصحيح 4.0.3، يجب ألا تطبق أولاً تصحيحات 4.0.1 و 4.0.2. وبالمثل، إذا كنت تستخدم إصدار النواة 4.0.2 وتريد الانتقال إلى 4.0.3، يجب أولاً عكس تصحيح 4.0.2 (أي patch -R) قبل تطبيق تصحيح 4.0.3. يمكنك قراءة المزيد حول هذا في Documentation/applying-patches.txt
بدلاً من ذلك، يمكن استخدام النص البرمجي patch-kernel لأتمتة هذه العملية. يحدد إصدار النواة الحالي ويطبق أي تصحيحات موجودة.
linux/scripts/patch-kernel linux
الوسيطة الأولى في الأمر أعلاه هي موقع مصدر النواة. يتم تطبيق التصحيحات من الدليل الحالي، ولكن يمكن تحديد دليل بديل كوسيطة ثانية.
تأكد من عدم وجود ملفات .o قديمة وتبعيات متروكة:
cd linux make mrproper
يجب أن يكون لديك الآن المصادر مثبتة بشكل صحيح.
متطلبات البرمجيات
يتطلب تجميع وتشغيل نواة 4.x إصدارات محدثة من حزم برمجية متنوعة. راجع Documentation/Changes للحصول على أرقام الإصدارات الدنيا المطلوبة وكيفية الحصول على تحديثات لهذه الحزم. احذر من أن استخدام إصدارات قديمة جدًا من هذه الحزم يمكن أن يسبب أخطاء غير مباشرة يصعب تتبعها، لذا لا تفترض أنه يمكنك فقط تحديث الحزم عند ظهور مشاكل واضحة أثناء البناء أو التشغيل.
دليل BUILD للنواة:
عند تجميع النواة، سيتم تخزين جميع ملفات الإخراج افتراضيًا جنبًا إلى جنب مع كود مصدر النواة. باستخدام الخيار "make O=output/dir" يمكنك تحديد مكان بديل لملفات الإخراج (بما في ذلك .config). مثال:
كود مصدر النواة: /usr/src/linux-4.X
دليل البناء: /home/name/build/kernel
لتكوين وبناء النواة، استخدم:
cd /usr/src/linux-4.X
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install
يرجى ملاحظة: إذا تم استخدام الخيار 'O=output/dir'، فيجب استخدامه لجميع استدعاءات make.
تكوين النواة:
لا تتخطى هذه الخطوة حتى لو كنت فقط تقوم بترقية إصدار ثانوي واحد. تتم إضافة خيارات تكوين جديدة في كل إصدار، و ستظهر مشاكل غريبة إذا لم يتم إعداد ملفات التكوين كما هو متوقع. إذا كنت ترغب في نقل تكوينك الحالي إلى إصدار جديد بأقل جهد، استخدم "make oldconfig"، والذي سيسألك فقط عن الإجابات للأسئلة الجديدة.
أوامر التكوين البديلة هي:
"make config" واجهة نصية عادية.
"make menuconfig" قوائم ملونة قائمة على النصوص، قوائم اختيار مربعات ومربعات حوار.
"make nconfig" قوائم ملونة محسنة قائمة على النصوص.
"make xconfig" أداة تكوين تعتمد على X windows (Qt).
"make gconfig" أداة تكوين تعتمد على X windows (Gtk).
"make oldconfig" يقرر جميع الأسئلة افتراضيًا بناءً على محتويات ملف ./.config الحالي ويطلب حول رموز التكوين الجديدة.
"make silentoldconfig" مثل ما سبق، لكنه يتجنب ازدحام الشاشة بأسئلة تمت الإجابة عليها بالفعل. بالإضافة إلى تحديث التبعيات.
"make olddefconfig" مثل ما سبق، لكنه يحدد الرموز الجديدة إلى قيمها الافتراضية دون مطالبة.
"make defconfig" إنشاء ملف ./.config باستخدام قيم الرموز الافتراضية إما من arch/$ARCH/defconfig أو arch/$ARCH/configs/${PLATFORM}_defconfig، حسب المعمارية.
"make ${PLATFORM}_defconfig" إنشاء ملف ./.config باستخدام قيم الرموز الافتراضية من arch/$ARCH/configs/${PLATFORM}_defconfig. استخدم "make help" للحصول على قائمة بجميع المنصات المتاحة لمعماريتك.
"make allyesconfig" إنشاء ملف ./.config عن طريق تعيين قيم الرموز إلى 'y' قدر الإمكان.
"make allmodconfig" إنشاء ملف ./.config عن طريق تعيين قيم الرموز إلى 'm' قدر الإمكان.
"make allnoconfig" إنشاء ملف ./.config عن طريق تعيين قيم الرموز إلى 'n' قدر الإمكان.
"make randconfig" إنشاء ملف ./.config عن طريق تعيين قيم الرموز إلى قيم عشوائية.
"make localmodconfig" إنشاء تكوين بناءً على التكوين الحالي و الوحدات المحملة (lsmod). يعطل أي خيار وحدة غير ضروري للوحدات المحملة.
لإنشاء localmodconfig لجهاز آخر،
قم بتخزين lsmod لذلك الجهاز في ملف
وقم بتمريره كمعامل LSMOD.
target$ lsmod > /tmp/mylsmod
target$ scp /tmp/mylsmod host:/tmp
host$ make LSMOD=/tmp/mylsmod localmodconfig
ما سبق يعمل أيضًا عند التجميع المتقاطع.
"make localyesconfig" مشابه لـ localmodconfig، باستثناء أنه سيحول جميع خيارات الوحدات إلى خيارات مدمجة (=y).
يمكنك العثور على مزيد من المعلومات حول استخدام أدوات تكوين نواة لينكس في Documentation/kbuild/kconfig.txt.
ملاحظات حول "make config":
وجود برامج تشغيل غير ضرورية سيجعل النواة أكبر، ويمكن تحت بعض الظروف أن يؤدي إلى مشاكل: البحث عن بطاقة تحكم غير موجودة قد يربك وحدات التحكم الأخرى لديك
تجميع النواة مع تعيين "نوع المعالج" أعلى من 386 سينتج نواة لا تعمل على 386. ستكتشف النواة هذا عند الإقلاع، وتتوقف.
نواة مع تضمين محاكاة الرياضيات (math-emulation) ستظل تستخدم المعالج المساعد إذا كان موجودًا: لن يتم استخدام محاكاة الرياضيات في هذه الحالة أبدًا. ستكون النواة أكبر قليلاً، لكنها ستعمل على أجهزة مختلفة بغض النظر عما إذا كانت تحتوي على معالج رياضي أم لا.
تفاصيل تكوين "kernel hacking" عادة ما تؤدي إلى نواة أكبر أو أبطأ (أو كليهما)، ويمكن أن تجعل النواة أقل استقرارًا عن طريق تكوين بعض الإجراءات لمحاولة كسر الكود السيئ بنشاط للعثور على مشاكل النواة (kmalloc()). وبالتالي يجب عليك على الأرجح الإجابة بـ 'n' على أسئلة "التطوير"، "التجريبي"، أو ميزات "التصحيح".
تجميع النواة:
تأكد من توفر gcc 3.2 على الأقل. لمزيد من المعلومات، راجع Documentation/Changes.
يرجى ملاحظة أنه لا يزال بإمكانك تشغيل برامج مستخدم a.out مع هذه النواة.
قم بعمل "make" لإنشاء صورة نواة مضغوطة. من الممكن أيضًا عمل "make install" إذا كان لديك lilo مثبتًا ليتناسب مع ملفات make للنواة، ولكن قد ترغب في التحقق من إعدادات lilo الخاصة بك أولاً.
للقيام بالتثبيت الفعلي، يجب أن تكون مستخدمًا جذرًا (root)، ولكن لا شيء من البناء العادي يتطلب ذلك. لا تستخدم اسم root بغير حق.
إذا قمت بتكوين أي من أجزاء النواة كـ modules، فسيكون
عليك أيضًا عمل "make modules_install".
إخراج تجميع/بناء النواة المفصل:
عادةً، يعمل نظام بناء النواة في وضع هادئ إلى حد ما (ولكن ليس صامتًا تمامًا). ومع ذلك، في بعض الأحيان تحتاج أنت أو مطوري النواة الآخرين إلى رؤية أوامر التجميع والربط وغيرها تمامًا كما يتم تنفيذها. لهذا، استخدم وضع "Verbose" للبناء. يتم ذلك عن طريق إدراج "V=1" في أمر "make". على سبيل المثال:
make V=1 all
لجعل نظام البناء يخبر أيضًا عن سبب إعادة بناء كل هدف، استخدم "V=2". القيمة الافتراضية هي "V=0".
احتفظ بنواة احتياطية في متناول اليد في حالة حدوث خطأ ما. هذا صحيح بشكل خاص بالنسبة لإصدارات التطوير، لأن كل إصدار جديد يحتوي على كود جديد لم يتم تصحيحه بعد. تأكد من الاحتفاظ بنسخة احتياطية من الوحدات المقابلة لتلك النواة أيضًا. إذا كنت تقوم بتثبيت نواة جديدة بنفس رقم إصدار نواتك العاملة، قم بعمل نسخة احتياطية من دليل الوحدات الخاص بك قبل عمل "make modules_install".
بدلاً من ذلك، قبل التجميع، استخدم خيار تكوين النواة "LOCALVERSION" لإلحاق لاحقة فريدة برقم إصدار النواة العادي. يمكن تعيين LOCALVERSION في قائمة "الإعداد العام".
لكي تقوم بإقلاع نواتك الجديدة، ستحتاج إلى نسخ صورة النواة (على سبيل المثال .../linux/arch/i386/boot/bzImage بعد التجميع) إلى المكان الذي توجد به نواتك القابلة للإقلاع المعتادة.
لم يعد إقلاع نواة مباشرة من قرص مرن دون مساعدة من محمل إقلاع مثل LILO مدعومًا.
إذا كنت تقوم بإقلاع لينكس من القرص الصلب، فمن المحتمل أنك تستخدم LILO، الذي يستخدم صورة النواة كما هو محدد في الملف /etc/lilo.conf. ملف صورة النواة عادة ما يكون /vmlinuz، /boot/vmlinuz، /bzImage أو /boot/bzImage. لاستخدام النواة الجديدة، احفظ نسخة من الصورة القديمة وانسخ الصورة الجديدة فوق القديمة. ثم، يجب عليك إعادة تشغيل LILO لتحديث خريطة التحميل!! إذا لم تفعل، فلن تتمكن من إقلاع صورة النواة الجديدة.
إعادة تثبيت LILO عادة ما تكون مسألة تشغيل /sbin/lilo. قد ترغب في تحرير /etc/lilo.conf لتحديد إدخال لصورتك النواة القديمة (على سبيل المثال /vmlinux.old) في حالة عدم عمل الجديدة. راجع وثائق LILO لمزيد من المعلومات.
بعد إعادة تثبيت LILO، يجب أن يكون كل شيء جاهزًا. قم بإيقاف تشغيل النظام، وأعد التشغيل، واستمتع!
إذا احتجت في أي وقت إلى تغيير جهاز الجذر الافتراضي، وضع الفيديو، حجم قرص رام (ramdisk)، إلخ. في صورة النواة، استخدم برنامج 'rdev' (أو بدلاً من ذلك خيارات إقلاع LILO عندما يكون ذلك مناسبًا). لا حاجة لإعادة تجميع النواة لتغيير هذه المعلمات.
أعد التشغيل باستخدام النواة الجديدة واستمتع.
إذا حدث خطأ ما:
إذا كانت لديك مشاكل تبدو ناتجة عن أخطاء في النواة، يرجى التحقق من الملف MAINTAINERS لمعرفة ما إذا كان هناك شخص معين مرتبط بالجزء من النواة الذي تواجه مشكلة معه. إذا لم يكن هناك أي شخص مدرج هناك، فإن أفضل شيء ثاني هو إرسال بريد إلكتروني إلي ([email protected])، وربما إلى أي قائمة بريدية أخرى ذات صلة أو إلى مجموعة الأخبار.
في جميع تقارير الأخطاء، يرجى إخباري عن أي نواة تتحدث، وكيفية تكرار المشكلة، وما هو إعدادك (استخدم فطنتك السليمة). إذا كانت المشكلة جديدة، أخبرني بذلك، وإذا كانت المشكلة قديمة، يرجى محاولة إخباري متى لاحظتها لأول مرة.
إذا أدى الخطأ إلى رسالة مثل
unable to handle kernel paging request at address C0000010 Oops: 0002 EIP: 0010:XXXXXXXX eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx ds: xxxx es: xxxx fs: xxxx gs: xxxx Pid: xx, process nr: xx xx xx xx xx xx xx xx xx xx xx
أو معلومات تصحيح مماثلة للنواة على شاشتك أو في سجل النظام، يرجى تكرارها بالضبط. قد تبدو التفريغة (dump) غير مفهومة لك، لكنها تحتوي على معلومات قد تساعد في تصحيح المشكلة. النص فوق التفريغة مهم أيضًا: فهو يخبرنا بشيء عن سبب تفريغ النواة للكود (في المثال أعلاه، يرجع ذلك إلى مؤشر نواة سيئ). مزيد من المعلومات حول فهم التفريغة موجود في Documentation/oops-tracing.txt
إذا قمت بتجميع النواة مع CONFIG_KALLSYMS يمكنك إرسال التفريغة كما هي، وإلا سيتعين عليك استخدام برنامج "ksymoops" لفهم التفريغة (لكن التجميع مع CONFIG_KALLSYMS عادة ما يكون مفضلاً). يمكن تنزيل هذه الأداة من ftp://ftp..kernel.org/pub/linux/utils/kernel/ksymoops/ . بدلاً من ذلك، يمكنك إجراء البحث عن التفريغة يدويًا:
في تصحيح الأخطاء مثل التفريغة أعلاه، يساعد بشكل كبير إذا كان بإمكانك البحث عن معنى قيمة EIP. القيمة السداسية العشرية كما هي لا تساعدني كثيرًا أو أي شخص آخر: ستعتمد على إعداد نواتك الخاص. ما يجب عليك فعله هو أخذ القيمة السداسية من سطر EIP (تجاهل "0010:")، والبحث عنها في قائمة أسماء النواة لمعرفة أي دالة من دوال النواة تحتوي على العنوان المخالف.
لمعرفة اسم دالة النواة، ستحتاج إلى العثور على الثنائي النظامي المرتبط بالنواة التي أظهرت الأعراض. هذا هو الملف 'linux/vmlinux'. لاستخراج قائمة الأسماء ومطابقتها مع EIP من تعطل النواة، قم بما يلي:
nm vmlinux | sort | less
سيعطيك هذا قائمة بعناوين النواة مرتبة ترتيبًا تصاعديًا، والتي من السهل العثور على الدالة التي تحتوي على العنوان المخالف. لاحظ أن العنوان المعطى من قبل رسائل تصحيح النواة لن يتطابق بالضرورة تمامًا مع عناوين الدوال (في الواقع، هذا غير مرجح جدًا)، لذا لا يمكنك فقط استخدام 'grep' في القائمة: القائمة ستعطيك، مع ذلك، نقطة البداية لكل دالة نواة، لذا من خلال البحث عن الدالة التي لها عنوان بداية أقل من الذي تبحث عنه ولكن يتبعها دالة بعنوان أعلى ستجد الدالة التي تريدها. في الواقع، قد تكون فكرة جيدة تضمين القليل من "السياق" في تقرير مشكلتك، مع إعطاء بضعة أسطر حول السطر المثير للاهتمام.
إذا لم تستطع لسبب ما القيام بما سبق (لديك صورة نواة مترجمة مسبقًا أو شيء مشابه)، فإن إخباري بقدر ما تستطيع عن إعدادك سيساعد. يرجى قراءة مستند REPORTING-BUGS للحصول على التفاصيل.
بدلاً من ذلك، يمكنك استخدام gdb على نواة قيد التشغيل. (للقراءة فقط؛ أي لا يمكنك تغيير القيم أو تعيين نقاط توقف.) للقيام بذلك، قم أولاً بتجميع النواة مع -g؛ قم بتحرير arch/i386/Makefile بشكل مناسب، ثم قم بعمل "make clean". ستحتاج أيضًا إلى تمكين CONFIG_PROC_FS (عبر "make config").
بعد إعادة التشغيل باستخدام النواة الجديدة، قم بعمل "gdb vmlinux /proc/kcore". يمكنك الآن استخدام جميع أوامر gdb المعتادة. الأمر للبحث عن النقطة التي تعطل فيها نظامك هو "l *0xXXXXXXXX". (استبدل XXXes بقيمة EIP.)
استخدام gdb على نواة غير قيد التشغيل يفشل حاليًا لأن gdb (بشكل خاطئ) يتجاهل الإزاحة الابتدائية التي تم تجميع النواة لها.