
شجرة مصدر نواة لينكس مع ثغرة CVE-2022-45934 محددة، مخصصة للبحث الأمني، تحليل الاستغلال، والدراسة التعليمية للأخطاء على مستوى النواة.
Linux kernel release 4.x http://kernel.org/
هذه هي ملاحظات الإصدار لنواة لينكس الإصدار 4. اقرأها بعناية، فهي تخبرك ما هو هذا كل شيء، وتشرح كيفية تثبيت النواة، وماذا تفعل إذا حدث خطأ ما.
ما هو لينكس؟
لينكس هو نسخة مطابقة لنظام التشغيل يونكس، تم كتابتها من الصفر بواسطة لينوس تورفالدس بمساعدة فريق غير رسمي من المخترقين عبر الإنترنت. يهدف إلى التوافق مع POSIX ومواصفات يونكس الموحدة.
يحتوي على جميع الميزات التي تتوقعها في نظام يونكس حديث ومتكامل، بما في ذلك تعدد المهام الحقيقي، الذاكرة الافتراضية، المكتبات المشتركة، التحميل عند الطلب، الملفات التنفيذية المشتركة للنسخ عند الكتابة، إدارة الذاكرة السليمة، والشبكات متعددة الأكوام بما في ذلك IPv4 و IPv6.
يتم توزيعه بموجب رخصة جنو العمومية العامة - راجع ملف COPYING المرفق لمزيد من التفاصيل.
على أي أجهزة يعمل؟
على الرغم من تطويره في البداية لأجهزة الكمبيوتر الشخصية القائمة على معمارية x86 32 بت (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 عن طريق التصحيحات. يتم توزيع التصحيحات بتنسيق 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). يعطل أي خيار وحدة غير ضروري للوحدات المحملة.
لإنشاء تكوين محلي لجهاز آخر،
قم بتخزين 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":
وجود برامج تشغيل غير ضرورية سيجعل النواة أكبر، ويمكن في بعض الظروف أن يؤدي إلى مشاكل: البحث عن بطاقة تحكم غير موجودة قد يربك وحدات التحكم الأخرى لديك.
تجميع النواة:
تأكد من أن لديك على الأقل gcc 3.2 متاح. لمزيد من المعلومات، راجع Documentation/Changes.
يرجى ملاحظة أنه يمكنك still تشغيل برامج المستخدم بصيغة a.out مع هذه النواة.
قم بتنفيذ "make" لإنشاء صورة نواة مضغوطة. من الممكن أيضًا تنفيذ "make install" إذا كان لديك lilo مثبتًا ليتوافق مع ملفات make للنواة، ولكن قد ترغب في التحقق من إعداد lilo الخاص بك أولاً.
للقيام بالتثبيت الفعلي، يجب أن تكون مستخدمًا جذريًا، ولكن لا يتطلب أي من عمليات البناء العادية ذلك. لا تتخذ اسم الجذر عبثًا.
إذا قمت بتكوين أي من أجزاء النواة كـ 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، يجب أن يكون كل شيء جاهزًا. قم بإيقاف تشغيل النظام، أعد التشغيل، واستمتع!
إذا احتجت في أي وقت إلى تغيير جهاز الجذر الافتراضي، وضع الفيديو، حجم قرص الرام، إلخ في صورة النواة، استخدم برنامج 'rdev' (أو بدلاً من ذلك خيارات إقلاع LILO عند الاقتضاء). لا حاجة لإعادة تجميع النواة لتغيير هذه المعلمات.
إذا حدث خطأ ما:
إذا كنت تواجه مشاكل تبدو وكأنها بسبب أخطاء في النواة، يرجى التحقق من الملف MAINTAINERS لترى ما إذا كان هناك شخص معين مرتبط بالجزء من النواة الذي تواجه مشكلة معه. إذا لم يكن هناك أي شخص مدرج هناك، فإن ثاني أفضل شيء هو إرسال بريد إلكتروني إلي ([email protected])، وربما إلى أي قائمة بريدية أخرى ذات صلة أو إلى مجموعة الأخبار.
في جميع تقارير bugs، يرجى ذكر النواة التي تتحدث عنها، وكيفية تكرار المشكلة، وما هو إعدادك (استخدم عقلك السليم). إذا كانت المشكلة جديدة، أخبرني بذلك، وإذا كانت المشكلة قديمة، يرجى محاولة إخباري متى لاحظتها لأول مرة.
إذا أدى الخطأ إلى رسالة مثل
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
أو معلومات تصحيح نواة مماثلة على شاشتك أو في سجل النظام الخاص بك، يرجى نسخها بالضبط. قد تبدو المخرجات غير مفهومة لك، لكنها تحتوي على معلومات قد تساعد في تصحيح المشكلة. النص فوق المخرجات مهم أيضًا: يخبر بشيء حول سبب قيام النواة بإلقاء الكود (في المثال أعلاه، يرجع ذلك إلى مؤشر نواة سيء). مزيد من المعلومات حول فهم المخرجات موجود في 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 للحصول على التفاصيل.
تجميع النواة مع تعيين "نوع المعالج" أعلى من 386 سينتج نواة لا تعمل على معالج 386. ستقوم النواة باكتشاف ذلك عند الإقلاع، وتتوقف.
النواة التي تحتوي على محاكاة رياضية مترجمة (math-emulation) ستظل تستخدم المعالج المساعد إذا كان موجودًا: لن يتم استخدام المحاكاة الرياضية في هذه الحالة. ستكون النواة أكبر قليلاً، ولكنها ستعمل على أجهزة مختلفة بغض النظر عما إذا كانت تحتوي على معالج رياضي أم لا.
تفاصيل تكوين "اختراق النواة" عادةً ما تؤدي إلى نواة أكبر أو أبطأ (أو كليهما)، ويمكنها حتى جعل النواة أقل استقرارًا عن طريق تكوين بعض الإجراءات لمحاولة كسر الكود السيئ بشكل نشط للعثور على مشاكل النواة (kmalloc()). وبالتالي يجب عليك على الأرجح الإجابة بـ 'n' على الأسئلة الخاصة بميزات "التطوير" أو "التجريبية" أو "التصحيح".
أعد التشغيل بالنواة الجديدة واستمتع.
بدلاً من ذلك، يمكنك استخدام gdb على نواة قيد التشغيل. (للقراءة فقط؛ أي لا يمكنك تغيير القيم أو تعيين نقاط التوقف.) للقيام بذلك، قم أولاً بتجميع النواة مع -g؛ قم بتحرير arch/i386/Makefile بشكل مناسب، ثم قم بتنفيذ "make clean". ستحتاج أيضًا إلى تمكين CONFIG_PROC_FS (عبر "make config").
بعد إعادة التشغيل بالنواة الجديدة، قم بتنفيذ "gdb vmlinux /proc/kcore". يمكنك الآن استخدام جميع أوامر gdb المعتادة. الأمر للبحث عن النقطة التي تعطل فيها نظامك هو "l *0xXXXXXXXX". (استبدل XXXes بقيمة EIP.)
استخدام gdb على نواة غير قيد التشغيل يفشل حاليًا لأن gdb (بشكل خاطئ) يتجاهل الإزاحة الأولية التي تم تجميع النواة بها.