কোনও লিনাক্স বাইনারি অবস্থান স্বাধীন কোড হিসাবে সংকলিত হয়েছিল কিনা তা কীভাবে পরীক্ষা করবেন?


38

আমি সম্প্রতি শিখেছি (কমপক্ষে ফেডোরা এবং রেড হ্যাট এন্টারপ্রাইজ লিনাক্সে), এক্সিকিউটেবল প্রোগ্রাম যা পজিশন ইন্ডিপেন্ডেন্ট এক্সিকিউটেবলস (পিআইই) হিসাবে সংকলিত হয় তারা শক্তিশালী অ্যাড্রেস স্পেস র‌্যান্ডমাইজেশন (এএসএলআর) সুরক্ষা পায়।

সুতরাং: আমি কীভাবে পরীক্ষা করব যে কোনও নির্দিষ্ট এক্সিকিউটেবলকে লিনাক্সে পজিশন ইন্ডিপেন্ডেন্ট এক্সিকিউটেবল হিসাবে সংকলিত হয়েছিল কিনা?


1
32-বিট সম্পর্কে নিশ্চিত নয়, তবে x86_64 কোডে ডিফল্টরূপে অবস্থান স্বাধীন । এবং অবশ্যই সমস্ত সিস্টেম প্যাকেজ উভয় খিলানে এইভাবে সংকলিত হয়।
মাইকেল হ্যাম্পটন

1
@ মিশেলহ্যাম্পটন, আমি মনে করি এটি সঠিক নয়। (এক্সিকিউটেবল বাইনারি এবং ভাগ করা লাইব্রেরির মধ্যে পার্থক্য সম্পর্কে সতর্ক থাকুন; আপনার বক্তব্য ভাগ করা লাইব্রেরিগুলির পক্ষে সঠিক হতে পারে, তবে আমি মনে করি না এটি এক্সিকিউটেবলের পক্ষে সঠিক।) এমনকি x86_64 এ বাইনারিগুলি ডিফল্টরূপে পিআইই বলে মনে হয় না। আমি কেবল একটি ছোট পরীক্ষা প্রোগ্রাম লিখেছি, এবং x86_64 তে, এটি পিআইই হিসাবে সংকলিত হয়নি। আমি মনে করি আপনাকে -pie -fpieপিআইই হিসাবে কোনও প্রোগ্রাম সংকলন করতে আপনাকে বিশেষ সংকলক পতাকাগুলি পাস করতে হবে । এই লিঙ্কটিতে অন্যান্য আকর্ষণীয় তথ্য ছিল, যদিও - আপনাকে ধন্যবাদ!
ডিডাব্লু

1
এই লোকটির সনাক্ত করার জন্য একটি বাশ স্ক্রিপ্ট রয়েছে: blog.fpmurphy.com/2008/06/position-ind dependent
executables.html

উত্তর:


32

আপনি প্যাকেজটিতে perlথাকা স্ক্রিপ্টটি ফেডোরা এবং ডেবিয়ান (আ ) -তে উপলব্ধ available কি সংকলন পতাকা চেক করা হয় তার বিশদ জন্য এই দেবিয়ান উইকি পৃষ্ঠা পড়ুন । এটি ডেবিয়ান নির্দিষ্ট, তবে তত্ত্বটি রেড হ্যাটকেও প্রযোজ্য।hardening-checkhardening-includes

উদাহরণ:

$ hardening-check $(which sshd)
/usr/sbin/sshd:
 Position Independent Executable: yes
 Stack protected: yes
 Fortify Source functions: yes (some protected functions found)
 Read-only relocations: yes
 Immediate binding: yes

উত্তম উত্তর, উবুন্টু 16.04 এলটিএস এবং সম্ভবত অন্যান্য উবুন্টু সংস্করণগুলিতেও প্রযোজ্য। sudo apt-get install hardening-includesএবং তারপরে hardening-checkএক্সিকিউটেবল পার্ল স্ক্রিপ্টটি সাধারণ PATH( /usr/bin/hardening-check) এ উপলব্ধ; মাত্র একটি নিট: ./উত্তরটি থেকে সরানোর পরামর্শ দিন ;-)
ডিলিট্যান্ট

@ a25bedc5-3d09-41b8-82fb-ea6c353d75a 17.10 এ আর নেই :-(
সিরো সান্তিলি 事件 中心 中心 法轮功 六四

সেন্টোস / রেডহ্যাট-এ, এই প্যাকেজটি এপেল সংগ্রহস্থলগুলিতে উপলভ্য
vikas027

@ a25bedc5-3d09-41b8-82fb-ea6c353d75ae দেখে মনে হচ্ছে এটি এখন উবুন্টুতে পাওয়া যায় না 18.04
ভাদিম কোতোভ

2
এটি রয়েছে এমন ডিবিয়ান প্যাকেজটিকে এখন বলা হয় devscripts
ট্যামস সেজেলি

15

readelf --relocsস্থিতিশীল বা গতিশীল লাইব্রেরিটি নিম্নলিখিত উপায়ে x86-64-তে PIC কিনা তা পরীক্ষা করে দেখতাম :

$ readelf --relocs /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.a |\
      awk '$3~/^R_/ && $5!~/^\.debug/{print $3}' |sort -u
R_X86_64_32
R_X86_64_32S
R_X86_64_64
R_X86_64_DTPOFF32
R_X86_64_GOTPCREL
R_X86_64_PC32
R_X86_64_PLT32
R_X86_64_TLSLD
R_X86_64_TPOFF32

আমরা এখানে R_X86_64_32এবং R_X86_64_32S। এর অর্থ কোডটি স্বাধীন অবস্থান নয়। আমি যখন -fPIC দিয়ে একটি লাইব্রেরি পুনর্নির্মাণ করি তখন আমি পাই:

$ readelf --relocs libstdc++.a |\
      awk '$3~/^R_/ && $5!~/^\.debug/{print $3}' |sort -u
R_X86_64_64
R_X86_64_DTPOFF32
R_X86_64_GOTPCREL
R_X86_64_PC32
R_X86_64_PLT32
R_X86_64_TLSGD
R_X86_64_TLSLD

এই পদ্ধতিটি সম্ভবত এক্সিকিউটেবলের জন্য কাজ করতে পারে তবে আমি সেভাবে এটি ব্যবহার করি নি।


8
আপনি কীভাবে ওয়ান-লাইনারের আউটপুটকে ব্যাখ্যা করবেন তা ব্যাখ্যা করার যত্ন নেবেন? ভাগ করা লাইব্রেরিটি পিআইসি বনাম নন-পিক হিসাবে শ্রেণিবদ্ধ করার জন্য কী মানদণ্ড রয়েছে?
DW

যদি আপনি এর সাথে একটি এক্সিকিউটেবল নির্মাণ করেন -fPIE -no-pieতবে এটি সর্বদা একই ঠিকানায় লোড হবে যদিও এটি পিআইই এক্সিকিউটেবল হিসাবে যুক্ত হতে পারে । (নন-পিআইই) বনাম ELF শেয়ার করা অবজেক্ট` (PIE) ব্যবহার করুন file a.outএবং সন্ধান করুন ELF executable: x86-64 লিনাক্সে 32-বিট পরম ঠিকানা আর অনুমোদিত নয়?
পিটার কর্ডেস

12

কেবল fileবাইনারি ব্যবহার করুন:

$ file ./pie-off
./pie-off: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0dc3858e9f0334060bfebcbe3e854909191d8bdc, not stripped
$ file ./pie-on
./pie-on: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=962235df5bd188e1ec48c151ff61b6435d395f89, not stripped

এলএসবি তথ্যের পরে মুদ্রিত বিভিন্ন ধরণের নোট করুন।


1
PIE / ASLR এর সাথে সংকলিত হলে কীভাবে এই শোটি দেখাবে?
বারুচ

3
পাই-অফ এবং পাই.অন এর আউটপুটগুলির মধ্যে একমাত্র পার্থক্য executableএবং shared object। আমি অনুমান করি যে ভাগ করা বস্তুগুলি পুনঃ স্থান পরিবর্তনযোগ্য হওয়া উচিত তাই আমার মনে পিআইই দিয়ে সংকলিত হয়েছে।
রিচার্ড ব্রাগানজা

হ্যাঁ, পিআইই এক্সিকিউটেবলগুলি হ'ল ইএলএফ ভাগ করা বস্তু; এক্সিকিউটেবলের জন্য এএসএলআর বাস্তবায়নের সবচেয়ে সহজ উপায় হ'ল একটি শেয়ার্ড অবজেক্টে ডায়নামিক লিংক এবং ইএলএফ এন্ট্রি পয়েন্টের জন্য বিদ্যমান সমর্থন ব্যবহার করা। আরও দেখুন 32 বিট পরম ঠিকানাগুলি আর x86-64 'লিনাক্স হালাল? জিসিসি বিকল্পগুলি সম্পর্কে যা পিআইই নিয়ন্ত্রণ করে এবং সেগুলি gcc -fPIE -pieএখন অনেকগুলি ডিস্ট্রোজে ডিফল্ট about
পিটার কর্ডেস

ফাইলের নতুন সংস্করণগুলিতে পাইটি স্পষ্টভাবে উল্লেখ করা হয়েছে: যেমন, জিএনইউ / লিনাক্সের জন্য ELF 64-বিট এলএসবি পাই এক্সিকিউটেবল, x86-64, সংস্করণ 1 (এসওয়াইএসভি), গতিশীলভাবে সংযুক্ত, দোভাষী /lib64/ld-linux-x86-64.so.2, ৩.২.০, বিল্ডআইডি [sha1] = 9b502fd78165cb04aec34c3f046c1ba808365a96, সরানো
ব্রায়ান মিন্টন

1
@ পিটারকর্ডস নোট করেছেন যে ৫.৩ filenow জন এখন DT_1_PIEপতাকার উপর ভিত্তি করে পিআইই-নেসকে সনাক্ত করতে পারে DT_FLAGS_1এবং এর pie executableপরিবর্তে পরিষ্কারভাবে বলেছে shared object
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四 事件

8

file 5.36 এটি পরিষ্কারভাবে বলেছে

fileএক্সিকিউটেবল PIE হয় বা না হলে 5.36 আসলে এটি পরিষ্কারভাবে প্রিন্ট করে। উদাহরণস্বরূপ, একটি পিআইই এক্সিকিউটেবল শো হিসাবে:

main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped

এবং একটি নন-পিআইই এক হিসাবে:

main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

বৈশিষ্ট্যটি 5.33 সালে চালু হয়েছিল তবে এটি কেবল একটি সাধারণ chmod +xচেক করেছে। তার আগে এটি কেবল shared objectপিআইইয়ের জন্য মুদ্রিত হয়েছিল।

৫.৩৪-তে এটি আরও বিশেষায়িত DF_1_PIEইএলএফ মেটাডেটা পরীক্ষা করা শুরু করা হয়েছিল , তবে বাস্তবায়নের ত্রুটির কারণে এটি আসলে জিনিসগুলি ভেঙে দিয়েছে এবং জিসিসি পিআইই এক্সিকিউটেবল হিসাবে দেখিয়েছে shared objects

আমি fileবাগের সহ উত্স কোডটি ব্যাখ্যা করেছি এবং ঠিক কীভাবে ELF ফর্ম্যাটটির বাইটগুলি এটি উদ্দীপক বিশদটি যাচাই করে: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object -instead অফ আন-এক্সিকিউটেবল-বাইনারি-অনুযায়ী-টু / 55704865 # 55704865

ফাইল 5.36 আচরণের একটি দ্রুত সংক্ষিপ্তসার হ'ল:

  • যদি Elf32_Ehdr.e_type == ET_EXEC
    • ছাপা executable
  • অন্যথায় যদি Elf32_Ehdr.e_type == ET_DYN
    • যদি DT_FLAGS_1গতিশীল বিভাগের এন্ট্রি উপস্থিত থাকে
      • যদি DF_1_PIEসেট করা থাকে DT_FLAGS_1:
        • ছাপা pie executable
      • আর
        • ছাপা shared object
    • আর
      • যদি ফাইল ব্যবহারকারী, গোষ্ঠী বা অন্যদের দ্বারা কার্যকর করা যায়
        • ছাপা pie executable
      • আর
        • ছাপা shared object

জিডিবি এক্সিকিউটেবল দু'বার চালায় এবং এএসএলআরটি দেখুন

একটি খুব প্রত্যক্ষ কাজ যা আপনি করতে পারেন তা হ'ল GDB এর মাধ্যমে দুবার এক্সিকিউটেবল চালানো এবং দেখুন যে ঠিকানাটি ASLR এর কারণে রান জুড়ে পাল্টে যায় কিনা।

কীভাবে এটি করবেন তা আমি এখানে বিশদে বর্ণনা করেছি: https://stackoverflow.com/questions/2463150/ কি-is-the-fpie-option-for-position-ind dependent-executables-in-gcc-and-ld/ 51308031 # 51308031

যদিও এটি কার্যকরভাবে কার্যকর সমাধান নয় এবং যদি আপনি নির্বাহযোগ্যকে বিশ্বাস না করেন তবে এটি সম্ভব নয়, এটি মজাদার এবং এটি চূড়ান্তভাবে যাচাই করে যা আমরা সত্যই যত্নশীল, এটি লিনাক্স কার্নেল / ডায়নামিক লোডার যদি এক্সিকিউটেবল লোকেশন পরিবর্তন করে বা না.


1
"রানগুলির মধ্যে প্রধান পরিবর্তনের ঠিকানা" - এটি খাঁটি পিআইই এর প্রভাব নয়, এটি পিআইই এবং সক্ষম এএসএলআর। হ্যাঁ, এটি প্রায় যে কোনও জায়গায় সক্ষম হয়েছে, তবে অক্ষম এএসএলআর ঠিকানাযুক্ত মেশিনগুলির জন্য উভয় সময় একই হবে। ASLR বিশ্বব্যাপী সক্রিয় করা যেতে পারে কিন্তু এর সঙ্গে যোগাযোগ নিষ্ক্রিয় setarch -R man7.org/linux/man-pages/man8/setarch.8.html " -R, --addr-no-randomize ভার্চুয়াল অ্যাড্রেস স্পেস এর অক্ষম র্যান্ডোমাইজেশন। সক্রিয় ADDR_NO_RANDOMIZE।" man7.org/linux/man-pages/man2/personality.2.html " ADDR_NO_RANDOMIZE(যেহেতু লিনাক্স ২. since.১২ ) এই পতাকা সেটটি দিয়ে ঠিকানা-স্থান-বিন্যাসের র্যান্ডমাইজেশন অক্ষম করে।"
osgx

2

এক্সিকিউটেবল মিটিগেশন প্রপার্টি (রেলরো, স্ট্যাক ক্যানারি, এনএক্স বিট, পিআইই, আরপাথ, রুনপাথ, ফোর্টিফাই সোর্স সহ) পরীক্ষা করতে গিথুবে রয়েছে বাশ স্ক্রিপ্ট চেকস্যাক.শ

(ফাইল ইনপুট) যুক্তি checksecদিয়ে চালান -f:

$ checksec -f /usr/bin/bash

RELRO           STACK CANARY      NX            PIE             RPATH     RUNPATH      FORTIFY Fortified Fortifiable
Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH    YES      13        33
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.