GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux-Standardverhalten gegenüber dem Abschnitt „.data“.

In Ihrer Binärdatei fehlt PT_GNU_STACK . Daher scheint diese Änderung durch den Commit 9fccc5c0c99f238aa1b0460fccbdb30a887e7036 verursacht worden zu sein :

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

Dies war erstmals in der 5.8-Serie vorhanden. Siehe auch Unerwartete Exec-Berechtigung von mmap, wenn Assembly-Dateien im Projekt enthalten sind.


Das ist nur eine Vermutung :Ich denke, der Übeltäter ist READ_IMPLIES_EXEC Persönlichkeit, die ohne PT_GNU_STACK automatisch eingestellt wurde Segment.

In der 5.4-Kernel-Quelle finden wir diesen Code:

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

Das ist das einzige, was eine RW-Sektion in eine RWX-Sektion verwandeln kann. Jede andere Verwendung von PROC_EXEC schien mir für diese Frage nicht geändert oder relevant zu sein.

Die executable_stack wird hier eingestellt:

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;

Aber wenn die PT_GNU_STACK Segment nicht vorhanden ist, behält diese Variable ihren Standardwert:

int executable_stack = EXSTACK_DEFAULT;

Jetzt ist dieser Arbeitsablauf identisch Was sich sowohl in 5.4 als auch in den neuesten Kernelquellen geändert hat, ist die Definition von 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)

Neuestes Linux:

/*
 * 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)

Beachten Sie, wie in der Version 5.4 der elf_read_implies_exec gab einen wahren Wert zurück, wenn der Stack nicht explizit war als nicht ausführbar markiert (über die PT_GNU_STACK Segment).

In der neuesten Quelle ist der Check jetzt defensiver:der elf_read_implies_exec gilt nur für ausführbare 32-Bit-Dateien, wenn kein PT_GNU_STACK vorhanden ist Segment wurde in der ELF-Binärdatei gefunden.

Ich habe Ihr Programm zusammengestellt, gelinkt und kein PT_GNU_STACK gefunden Segment, also kann der Grund sein.
Wenn dies tatsächlich das Problem ist und wenn ich den Code richtig befolgt habe, wenn Sie den Stack als nicht ausführbar in der Binärdatei festlegen, sollte sein Datenabschnitt nicht mehr als ausführbar abgebildet werden (nicht einmal unter Linux 5.4).


Linux
  1. Linux – Antworten auf derselben Schnittstelle wie eingehende?

  2. So finden Sie die Standard-Gateway-IP in Linux

  3. Ändern Sie den Standardmonitor der Linux-Konsole

  4. Was ist die Standardreihenfolge der Linux-Sortierung?

  5. Standardberechtigungen für Linux-Home-Verzeichnisse

Dig-Befehl in Linux (DNS-Lookup)

Ubuntu-Standardhintergründe auf Arch Linux

So zeigen Sie einen bestimmten Abschnitt in Manpages in Linux an

So ändern Sie die Standard-Sudo-Protokolldatei in Linux

Setzen Sie die Gnome-Desktopeinstellungen unter Linux auf die Standardeinstellungen zurück

So ändern Sie die Standard-Shell im Linux-System