GNU/Linux >> Belajar Linux >  >> Linux

Perilaku default Linux terhadap bagian `.data`

Biner Anda tidak memiliki PT_GNU_STACK . Dengan demikian, perubahan ini tampaknya disebabkan oleh komit 9fccc5c0c99f238aa1b0460fccbdb30a887e7036 :

From 9fccc5c0c99f238aa1b0460fccbdb30a887e7036 Mon Sep 17 00:00:00 2001
From: Kees Cook <[email protected]>
Date: Thu, 26 Mar 2020 23:48:17 -0700
Subject: x86/elf: Disable automatic READ_IMPLIES_EXEC on 64-bit

With modern x86 64-bit environments, there should never be a need for
automatic READ_IMPLIES_EXEC, as the architecture is intended to always
be execute-bit aware (as in, the default memory protection should be NX
unless a region explicitly requests to be executable).

There were very old x86_64 systems that lacked the NX bit, but for those,
the NX bit is, obviously, unenforceable, so these changes should have
no impact on them.

Suggested-by: Hector Marco-Gisbert <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
Signed-off-by: Borislav Petkov <[email protected]>
Reviewed-by: Jason Gunthorpe <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
---
 arch/x86/include/asm/elf.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/elf.h b/arch/x86/include/asm/elf.h
index 397a1c74433ec..452beed7892bb 100644
--- a/arch/x86/include/asm/elf.h
+++ b/arch/x86/include/asm/elf.h
@@ -287,7 +287,7 @@ extern u32 elf_hwcap2;
  *                 CPU: | lacks NX*  | has NX, ia32     | has NX, x86_64 |
  * ELF:                 |            |                  |                |
  * ---------------------|------------|------------------|----------------|
- * missing PT_GNU_STACK | exec-all   | exec-all         | exec-all       |
+ * missing PT_GNU_STACK | exec-all   | exec-all         | exec-none      |
  * PT_GNU_STACK == RWX  | exec-stack | exec-stack       | exec-stack     |
  * PT_GNU_STACK == RW   | exec-none  | exec-none        | exec-none      |
  *
@@ -303,7 +303,7 @@ extern u32 elf_hwcap2;
  *
  */
 #define elf_read_implies_exec(ex, executable_stack)    \
-   (executable_stack == EXSTACK_DEFAULT)
+   (mmap_is_ia32() && executable_stack == EXSTACK_DEFAULT)
 
 struct task_struct;
 
-- 
cgit 1.2.3-1.el7

Ini hadir pertama kali di seri 5.8. Lihat juga Izin exec tak terduga dari mmap saat file rakitan disertakan dalam proyek.


Ini hanya tebakan :Saya pikir pelakunya adalah READ_IMPLIES_EXEC kepribadian yang diatur secara otomatis tanpa adanya PT_GNU_STACK segmen.

Di sumber kernel 5.4 kita dapat menemukan potongan kode ini:

SET_PERSONALITY2(loc->elf_ex, &arch_state);
if (elf_read_implies_exec(loc->elf_ex, executable_stack))
    current->personality |= READ_IMPLIES_EXEC;

Itulah satu-satunya hal yang dapat mengubah bagian RW menjadi bagian RWX. Penggunaan lain dari PROC_EXEC sepertinya tidak diubah atau relevan dengan pertanyaan ini, bagi saya.

executable_stack diatur di sini:

for (i = 0; i < loc->elf_ex.e_phnum; i++, elf_ppnt++)
    switch (elf_ppnt->p_type) {
    case PT_GNU_STACK:
        if (elf_ppnt->p_flags & PF_X)
            executable_stack = EXSTACK_ENABLE_X;
        else
            executable_stack = EXSTACK_DISABLE_X;
        break;

Tetapi jika PT_GNU_STACK segmen tidak ada, variabel tersebut mempertahankan nilai defaultnya:

int executable_stack = EXSTACK_DEFAULT;

Sekarang alur kerja ini identik baik pada 5.4 maupun sumber kernel terbaru, yang berubah adalah definisi dari elf_read_implies_exec :

Linux 5.4:

/*
 * An executable for which elf_read_implies_exec() returns TRUE will
 * have the READ_IMPLIES_EXEC personality flag set automatically.
 */
#define elf_read_implies_exec(ex, executable_stack) \
    (executable_stack != EXSTACK_DISABLE_X)

Linux terbaru:

/*
 * An executable for which elf_read_implies_exec() returns TRUE will
 * have the READ_IMPLIES_EXEC personality flag set automatically.
 *
 * The decision process for determining the results are:
 *
 *                 CPU: | lacks NX*  | has NX, ia32     | has NX, x86_64 |
 * ELF:                 |            |                  |                |
 * ---------------------|------------|------------------|----------------|
 * missing PT_GNU_STACK | exec-all   | exec-all         | exec-none      |
 * PT_GNU_STACK == RWX  | exec-stack | exec-stack       | exec-stack     |
 * PT_GNU_STACK == RW   | exec-none  | exec-none        | exec-none      |
 *
 *  exec-all  : all PROT_READ user mappings are executable, except when
 *              backed by files on a noexec-filesystem.
 *  exec-none : only PROT_EXEC user mappings are executable.
 *  exec-stack: only the stack and PROT_EXEC user mappings are executable.
 *
 *  *this column has no architectural effect: NX markings are ignored by
 *   hardware, but may have behavioral effects when "wants X" collides with
 *   "cannot be X" constraints in memory permission flags, as in
 *   https://lkml.kernel.org/r/[email protected]
 *
 */
#define elf_read_implies_exec(ex, executable_stack) \
    (mmap_is_ia32() && executable_stack == EXSTACK_DEFAULT)

Perhatikan bagaimana dalam versi 5.4 elf_read_implies_exec mengembalikan nilai sebenarnya jika stack tidak secara eksplisit ditandai sebagai tidak dapat dieksekusi (melalui PT_GNU_STACK segmen).

Di sumber terbaru, cek sekarang lebih defensif:elf_read_implies_exec benar hanya pada 32-bit yang dapat dieksekusi, dalam kasus di mana tidak ada PT_GNU_STACK segmen ditemukan dalam biner ELF.

Saya menyusun program Anda, menautkannya, dan tidak menemukan PT_GNU_STACK segmen, jadi ini mungkin menjadi alasannya.
Jika ini memang masalahnya dan jika saya mengikuti kode dengan benar, jika Anda menyetel tumpukan sebagai tidak dapat dieksekusi dalam biner, bagian datanya tidak boleh dipetakan untuk dapat dieksekusi lagi (bahkan di Linux 5.4).


Linux
  1. Linux – Membalas Pada Antarmuka yang Sama Saat Masuk?

  2. Cara Menemukan IP Gateway Default di Linux

  3. Lokasi default database PostgreSQL di Linux

  1. Ubah Perilaku Tombol Daya Linux

  2. Apakah sistem Linux membutuhkan antivirus terhadap ransomware?

  3. Apa urutan default dari jenis Linux?

  1. Bagaimana saya mengonfigurasi Vim sebagai editor default saya di Linux

  2. Izin default pada direktori home Linux

  3. Linux - temukan hit dari rute default