সেলিনাক্স এবং ক্রুট সিস্টেম কল


21

টি এল; ডিআর: পোর্টেবল, বিকাশকারী-ভিত্তিক মূল প্রক্রিয়া, যা সমস্ত অ্যান্ড্রয়েড মেশিন জুড়ে কাজ করে, এটি চূড়ান্ত পদক্ষেপ সম্পর্কে একটি প্রশ্ন। এটি কোনও শোষণের ভিত্তিতে নয় - এটি এমন একটি বিষয় যা আমরা আমাদের নিজস্ব মেশিনে বিকাশকারী হিসাবে আইনত ও নৈতিকভাবে অনুমতিপ্রাপ্ত। যদি আমি কোনও উত্তর পাই এবং আমার ডেবিয়ানের অভ্যন্তরে ঘাঁটাঘাঁটি করতে পরিচালনা করি, তবে আমি তাদের সমস্ত ট্যাবলেটগুলিতে রুট অ্যাক্সেস চায় এমন সমস্ত সহযোগী বিকাশকারীদের জন্য এই প্রক্রিয়াটির সমস্ত পদক্ষেপের বিশদ একটি সংক্ষিপ্ত ব্লগ পোস্ট করব - এবং সন্দেহজনক-উত্সকে বিশ্বাস করতে চাই না "এক-ক্লিক-শিকড়" যা তাদের মেশিনগুলিতে (বোটনেট সদস্য?) কী Godশ্বরকে জানে - কেবলমাত্র নির্ভরতাগুলি মেশিনের কার্নেল উত্সগুলি (যা নির্মাতাকে আইনত বাধ্যতামূলকভাবে বাধ্যতামূলক করা হবে) এবং বুট পার্টিশন চিত্র (boot.img) যা নির্মাতারা প্রদত্ত ওভার-দ্য এয়ার আপডেটের অভ্যন্তরে 99% সময় বা স্বতন্ত্রভাবে ফ্ল্যাশ-সক্ষম চিত্র হিসাবে স্বতন্ত্রভাবে ডাউনলোডযোগ্য inside

সুতরাং, এক সপ্তাহ কেটে গেল যেখানে আমি আমার ফ্রি সময়টি আমার নতুন অ্যান্ড্রয়েড ট্যাবলেটে কাটিয়েছি।

এবং আমার অ্যান্ড্রয়েড 5.0.2 ট্যাবলেটে রুট অর্জনের জন্য, একটি পোর্টেবল, বিকাশমুখী প্রক্রিয়া তৈরি করতে - আমি প্রায় সম্পূর্ণ সফল হয়েছি।

তবে এখনও একটি জিনিস অনুপস্থিত - আমি একটি ক্রুট করতে পারি না (যা আমার debootstrapবয়সের দেবিয়ান চালাতে হবে !)

এতক্ষণ যা করেছি

  1. প্রথমে, আমি আমার ট্যাবলেটটির (প্রস্তুতকারক সরবরাহিত) কার্নেল উত্সগুলিতে একটি ছোটখাটো প্যাচ করেছি এবং তারপরে আমার নিজের কার্নেলটি সংকলিত করেছি - যেখানে আমি সেলিনাক্স এনফোর্সিং মোড পরিবর্তন করার জন্য চেকগুলি অক্ষম করেছিলাম । বিশেষ করে ...

ইন security/selinux/selinuxfs.c:

...
if (new_value != selinux_enforcing) {
    /* Commented out by ttsiodras.
    length = task_has_security(current, SECURITY__SETENFORCE);
    if (length)
        goto out;
    */
    audit_log(current->audit_context, GFP_KERNEL, AUDIT_MAC_STATUS,
        "enforcing=%d old_enforcing=%d auid=%u ses=%u",
        new_value, selinux_enforcing,
  1. আমি তখন আমার আরআরডি চিত্রটি /default.propধারণ করে পরিবর্তন করেছি : ro.secure=0এবংro.debuggable=1

  2. যেহেতু আমার নির্মাতার initrd.imgএটা অনুপস্থিত ছিল আমিও কম্পাইল su.cথেকে https://android.googlesource.com/platform/system/extras/+/master/su/ এবং তার ফলে বাইনারি অধীনে স্থাপন /sbin/suকরে, নিশ্চিত করুন যে এটি এর SUID রুট সেট করা হয় ( chmod 04755 /sbin/su) ।

এর পরে, আমি আমার পূর্ববর্তী পোস্টের ২ য় পর্বে যেমনটি ব্যাখ্যা করেছি - এবং আমার নিজের ইমেজটি থেকে বুট করা হয়েছে আমি নতুন কার্নেল এবং নতুন আরআরডি প্যাকেজ করেছি:

adb reboot boot-loader ; fastboot boot myboot.img

তাহলে, আপনি কি মূল?

হ্যাঁ, এটি প্রথমদিকে সফল বলে মনে হয়েছিল:

$ adb shell

shell@K01E_2:/ $ id

uid=2000(shell) gid=2000(shell) groups=1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),
3003(inet),3006(net_bw_stats) 
context=u:r:shell:s0

shell@K01E_2:/ $ ls -l /sbin/su /sbin/_su
-rwxr-xr-x root     root          131 2015-10-03 10:44 su
-rwsr-xr-x root     root         9420 2015-10-03 01:31 _su

(the _su is the binary I compiled, set to SUID root, and "su" is
 a script I wrote to tell "su" to add me to all these groups...)

shell@K01E_2:/ $ cat /sbin/su

#!/system/bin/sh
export PATH=/system/bin:$PATH
exec /sbin/_su 0,0,1000,1028,2000,2001,1004,1007,1011,1015,\
   1028,3001,3002,3003,3006

এবং আমি এখন মূল অর্জন করেছি:

shell@K01E_2:/ $ su

root@K01E_2:/ # id

uid=0(root) gid=0(root) 
groups=1000(system),1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),1028(sdcard_r),2000(shell),2001(cache),
3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) 
context=u:r:shell:s0

আমি 100% নিশ্চিত যে আমি রুট - কেবল তাই idবলে তা নয়, কারণ আমি এমন কিছু করতে পারি যা স্বাভাবিক প্রক্রিয়াগুলি অবশ্যই করতে পারে না:

root@K01E_2:/ # ls -l /dev/block/platform/msm_sdcc.1/by-name/boot
lrwxrwxrwx root root 2015-10-03 10:47 boot -> /dev/block/mmcblk0p16

root@K01E_2:/ # dd if=/dev/block/mmcblk0p16 of=/dev/null bs=1M
16+0 records in
16+0 records out
16777216 bytes transferred in 0.569 secs (29485441 bytes/sec)

দেখুন এবং দেখুন - আমি শেষ পর্যন্ত আমার ট্যাবলেট থেকে কাঁচা পার্টিশনগুলি পড়তে পারি!

এবং সেলিনাক্স সত্যই "ডাউন, কুকুর" মোডে রয়েছে:

root@K01E_2:/ # getenforce                                                     
Permissive

তবে ... এখনও কিছু জিনিস আছে যা আমি করতে পারি না:

root@K01E_2:/ # mkdir /my_mnt

root@K01E_2:/ # mount -t ext4 /dev/block/mmcblk1p2 /my_mnt
mount: Operation not permitted

এটি হ'ল আমি আমার বাহ্যিক এসডি কার্ডের ২ য় পার্টিশনটি আমার EXT4-fs টি মাউন্ট করতে পারি না।

আমি আমার debootstrapসুদৃ -় ডিম্বিয়ানকেও আঁকতে পারি না :

root@K01E_2:/ # chroot /data/debian/ /bin/bash                             
chroot() fail
Operation not permitted

এটি সেলইনুকসের কারণে?

আমি জানি না - সেলইনাক্সে আমি নতুন (খুব নতুন - এক সপ্তাহ বয়সী)। আমি ভেবেছিলাম যে আপনি যখন এটি ঘুমিয়ে রাখেন ( getenforce"পার্মিসিভ" প্রতিবেদন করা) এটি আর হস্তক্ষেপ করে না ...

স্পষ্টতই, আমি ভুল ছিল। খরগোশের গর্তের নীচে আমরা আবার যাই ...

এটি কি আমার প্রক্রিয়া প্রসঙ্গে হতে পারে?

মনে আছে এটি idফিরে এসেছে ... "uid = 0 (মূল) জিড = 0 (মূল) ... প্রসঙ্গ = ইউ: আর: শেল: এস 0 "

আমি কি সেই প্রসঙ্গে পরিবর্তন করতে পারি? মূল এবং সমস্ত হয়েও কি আমি এখান থেকে সরে যেতে পারি shell? এবং যদি তাই হয়, কি সরানো?

প্রথম প্রশ্নের উত্তর runcon:

shell@K01E_2:/ $ runcon u:r:debuggerd:s0 /sbin/su

root@K01E_2:/ # id
uid=0(root) gid=0(root)... context=u:r:debuggerd:s0

ভাল. তবে কোন প্রসঙ্গ আমাকে অনুমতি দেবে mountএবং chroot?

আমার মূল মেশিনে ফিরে সেলইনক্স সম্পর্কে আরও কিছু পড়ার পরে আমি /sepolicyফাইলটির মূলটিতে পার্স করছি initrd.img:

linuxbox$ $ sesearch -A sepolicy | grep chroot
allow init_shell init_shell : capability { chown sys_chroot ...
allow init init : capability { chown dac_read_search sys_chroot ...
allow kernel kernel : capability { chown dac_override sys_chroot ... 
allow asus-dbug-d asus-dbug-d : capability { chown sys_chroot ...
...

ঠিক আছে, অনেকগুলি সম্ভাবনা! বিশেষত যে kernelএক প্রতিশ্রুতিবদ্ধ বলে মনে হচ্ছে:

shell@K01E_2:/ $ runcon u:r:kernel:s0 /sbin/su

root@K01E_2:/ # id
uid=0(root) gid=0(root)... context=u:r:kernel:s0

root@K01E_2:/ # chroot /data/debian/ /bin/bash                             
chroot() fail
Operation not permitted

অভিশাপ।

কে হ্যাক আমাকে chrootআইএনজি থেকে বাধা দিচ্ছে?

কোন পরামর্শ সর্বাধিক স্বাগত ...

উত্তর:


12

কে হ্যাক আমাকে ক্রুটিং থেকে বাধা দিচ্ছে?

এটি সেলিনাক্স ছিল না - এটি একটি বুনো হংসের তাড়া ছিল ( getenforce"পার্মিসিভ" ফিরিয়ে দেওয়ার অর্থ হ'ল সেলিনাক্স প্রকৃতপক্ষে আর ছবিতে নেই)।

অভিযুক্ত ব্যক্তি - বেশ একটি সংখ্যা যোগ করার পরে printkকার্নেলের উৎস উভয় ব্যর্থতা ট্রেস chrootএবং mount- নিষ্কাশিত হতে ক্ষমতা । আরও সুনির্দিষ্টভাবে, অ্যান্ড্রয়েডের "সামর্থ্য সীমানা সেট" - আপনি আপনার man( man 7 capabilities) এর মাধ্যমে সেগুলি সম্পর্কে সমস্ত কিছু পড়তে পারেন এবং আমি স্বীকার করি যে আমি এগুলি অনুসন্ধান করার আগে কখনও বিরক্ত করিনি - আমার দৈনন্দিন ইউনিক্স কাজগুলি তাদের উপর নির্ভর করে এবং আমার কোনও ধারণা ছিল না ... এটি চেষ্টা করে দেখুন আপনার লিনাক্স বাক্সটি নিজের জন্য দেখুন:

$ getfattr -d -m - /sbin/ping
getfattr: Removing leading '/' from absolute path names
# file: sbin/ping
security.capability=0s......

দেখা? পিং আর SID মূল নয় - এটি কাঁচা সকেট স্তরটিতে অ্যাক্সেস রয়েছে তা জানার জন্য এটি ফাইল সিস্টেমের বর্ধিত বৈশিষ্ট্যগুলিতে সঞ্চিত তথ্য ব্যবহার করে (যাতে এটি আইসিএমপি জিনিসটি করতে পারে - এটি আইপি স্তরে)।

যাইহোক, আমি খুঁতখুঁতে করি - আমার কর্নেলের শল্য চিকিত্সার জায়গা যেখানে আমি "আমার দক্ষতা সেট ফেলে দিন" থামিয়ে দিয়েছিলাম - তর্কযোগ্যভাবে জঘন্য হিসাবে, "তাদের সবাইকে" পদ্ধতিতে যাত্রা দিন - এটি ছিল ( security/commoncap.c):

static long cap_prctl_drop(struct cred *new, unsigned long cap)
{
    if (!capable(CAP_SETPCAP))
        return -EPERM;
    if (!cap_valid(cap))
        return -EINVAL;

    // ttsiodras: come in, everyone, the water's fine!
    //cap_lower(new->cap_bset, cap);
    return 0;
}

এর অর্থ হ'ল ক্ষমতাগুলি কখনই বাদ পড়ে না - একটি খুব সুরক্ষিত কনফিগারেশন, সত্যই :-)

$ adb shell

shell@K01E_2:/ $ su

root@K01E_2:/ # chroot /data/debian/ /bin/bash

root@localhost:/# export PATH=/bin:/sbin:/usr/bin:/usr/sbin:\
     /usr/local/bin:$PATH

root@localhost:/# cat /etc/issue
Debian GNU/Linux 8 \n \l

হ্যালো, আমার মিষ্টি দেবিয়ান :-)

ওহ, এবং "রুট চেকার" কাজ করে - আমি "su.c" কেড়ে ফেলেছি, তাই আমার ট্যাবলেটের প্রত্যেকটি রুট হয়ে উঠতে পারে:

int main(int argc, char **argv)
{
  struct passwd *pw;
  uid_t uid, myuid;
  gid_t gid, gids[50];

  /* Until we have something better, only root and shell can use su. */
  myuid = getuid();
  //
  // ttsiodras - Oh no, you don't :-)
  //
  //if (myuid != AID_ROOT && myuid != AID_SHELL) {
  //    fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
  //    return 1;
  //}

এখন এটি কাজ করে, আমাকে অবশ্যই এটি সঠিকভাবে কাজ করাতে হবে - অর্থাৎ কেবলমাত্র আমার termuxএবং Terminal Emulatorব্যবহারকারীদেরই অনুরোধ করতে suএবং chrootএবং প্রত্যেককে এবং তাদের দাদীকে :-) এ প্রবেশ করতে দেওয়া উচিত নয়


এই রুট পদ্ধতির জন্য আপনার নিজের কার্নেলটি ফ্ল্যাশ করার দক্ষতার প্রয়োজন নেই? এবং এটি করতে একটি আনলক করা বুটলোডার প্রয়োজন। কোন মুহুর্তে আপনি কেবল একটি কাস্টম পুনরুদ্ধার ফ্ল্যাশ করতে পারেন এবং সেভাবে রুট পেতে পারেন।
1110101001

@ 1110101001 বুটলোডারের জন্য: অবশ্যই, হ্যাঁ। কাস্টম পুনরুদ্ধারের জন্য: আমার ট্যাবলেটের জন্য এটি এখনও নেই (এখনও) - আমি এখন একটি তৈরির মতো অবস্থানে আছি, যদিও ;-)
ttsiodras

1
@ 1110101001: এবং আরও একটি জিনিস - আপনি বলেন, "ফ্ল্যাশ করার ক্ষমতা" - আমি ট্যাবলেটে আমার বুট ইমেজ চমকিত নি, আমি এটা থেকে বুট করছি: fastboot boot my.img। আমি বিশ্বাস করি Rooting সম্প্রদায় এই একটি কল দড়ি দ্বারা আবদ্ধ Rooting :-) এবং অবশ্যই আমি এটা ফ্ল্যাশ যায়নি - যদি আমি করতে চেয়েছিলেন।
ttsiodras
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.