<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>38225</bug_id>
          
          <creation_ts>2020-03-16 22:18:22 +0300</creation_ts>
          <short_desc>AltHa позволяет запустить интерпретатор через ld-linux</short_desc>
          <delta_ts>2022-07-20 15:54:02 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>kernel-image-un-def</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>NOTABUG</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>major</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="mikhailnov">m</reporter>
          <assigned_to name="Vitaly Chikunov">vt</assigned_to>
          <cc>kernelbot</cc>
    
    <cc>nbr</cc>
    
    <cc>placeholder</cc>
    
    <cc>vt</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>188570</commentid>
    <comment_count>0</comment_count>
    <who name="mikhailnov">m</who>
    <bug_when>2020-03-16 22:18:22 +0300</bug_when>
    <thetext>На 5.5.6-un-def-alt1 в соответствии с https://www.altlinux.org/AltHa и Documentation/admin-guide/LSM/AltHa.rst настроил блокировку интерпретатор, но в дефолтной рекомендуемой конфигурации нет проблем запустить заблокированный интерпретатор:

[root@alt-xfce ~]# sysctl -w kernel.altha.rstrscript.enabled=1
[root@alt-xfce ~]# sysctl -w kernel.altha.rstrscript.interpreters=/usr/bin/python:/usr/bin/python3:/usr/bin/perl:/usr/bin/tclsh
[root@alt-xfce ~]# python3
-bash: /usr/bin/python3: Операция не позволена
[root@alt-xfce ~]# dmesg | tail -n 1
[  162.090737] AltHa/RestrScript: /usr/bin/python3 is blocked to run directly by 0
[root@alt-xfce ~]# /lib64/ld-linux-x86-64.so.2 /usr/bin/python3
Python 3.7.4 (default, Oct 18 2019, 08:46:11) 
[GCC 8.3.1 20190507 (ALT Sisyphus 8.3.1-alt5)] on linux
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&gt;&gt;&gt; 

Но при этом:

[root@alt-xfce ~]# setarch --addr-no-randomize /usr/bin/python3
setarch: невозможно выполнить /usr/bin/python3: Операция не позволена
[root@alt-xfce ~]# dmesg | tail -n 1
[  597.621353] AltHa/RestrScript: /usr/bin/python3 is blocked to run directly by 0
[root@alt-xfce ~]# 

В коде вижу, что производится сравнение путей:
&gt; if (path_equal(&amp;bprm-&gt;file-&gt;f_path, &amp;node-&gt;path)) {
http://git.altlinux.org/gears/k/kernel-image-un-def.git?p=kernel-image-un-def.git;a=blob;f=security/altha/altha_lsm.c;h=7d1cc8f8a1a7ada31975473935a620e8ff2f772d;hb=HEAD#l260

Как это красиво решить, я пока не придумал.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188575</commentid>
    <comment_count>1</comment_count>
    <who name="Anton V. Boyarshinov">boyarsh</who>
    <bug_when>2020-03-17 11:12:35 +0300</bug_when>
    <thetext>Спасибо, будем думать</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188576</commentid>
    <comment_count>2</comment_count>
    <who name="Anton V. Boyarshinov">boyarsh</who>
    <bug_when>2020-03-17 11:35:02 +0300</bug_when>
    <thetext>На мой взгляд, самое простое и разумное -- добавить /lib64/ld-linux-x86-64.so.2 и /lib/ld-linux.so.2 (ну и на других платформах соответственно)  в списки ограничений altha.

Обычно они не запускаются напрямую.

Что-то, скорее всего, сломается (как и при блокировке прямого запуска интерпретаторов вообще), но быстрый тест на рабочей станции 9 не показал регрессий.

Спасибо за сообщение, эту информацию обязательно надо будет внести в документацию</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188580</commentid>
    <comment_count>3</comment_count>
    <who name="mikhailnov">m</who>
    <bug_when>2020-03-17 13:45:16 +0300</bug_when>
    <thetext>Я тоже не придумал, чем на типовой рабочей станции может помешать запрет запуска ld-linux*. Но здесь хочется выяснить, почему при запуске через ld-linux не происходит блокировки, через strace видны одинаковые системные вызовы:
[root@alt-xfce ~]# strace /lib64/ld-linux-x86-64.so.2 /usr/bin/python3 2&gt;&amp;1 | grep /usr/bin/python3
execve(&quot;/lib64/ld-linux-x86-64.so.2&quot;, [&quot;/lib64/ld-linux-x86-64.so.2&quot;, &quot;/usr/bin/python3&quot;], 0x7fff7c00c658 /* 45 vars */) = 0
openat(AT_FDCWD, &quot;/usr/bin/python3&quot;, O_RDONLY|O_CLOEXEC) = 3
&lt;...&gt;
[root@alt-xfce ~]# strace /bin/sh /usr/bin/python3 2&gt;&amp;1 | grep /usr/bin/python3
execve(&quot;/bin/sh&quot;, [&quot;/bin/sh&quot;, &quot;/usr/bin/python3&quot;], 0x7ffe002e9148 /* 45 vars */) = 0
openat(AT_FDCWD, &quot;/usr/bin/python3&quot;, O_RDONLY) = 3
&lt;...&gt;
[root@alt-xfce ~]# 
В первом случае блокировка не срабатывает, во втором срабатывает.
Надеюсь, через user mode linux получится проследить, как так получается. Сборки uml с altha у меня уже есть, пока не запускал и не уверен, что под uml LSM будут работать.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>188581</commentid>
    <comment_count>4</comment_count>
    <who name="Anton V. Boyarshinov">boyarsh</who>
    <bug_when>2020-03-17 14:16:12 +0300</bug_when>
    <thetext>(Ответ для Михаил Новоселов на комментарий #3)
&gt; Я тоже не придумал, чем на типовой рабочей станции может помешать запрет
&gt; запуска ld-linux*. Но здесь хочется выяснить, почему при запуске через
&gt; ld-linux не происходит блокировки, через strace видны одинаковые системные
&gt; вызовы:
&gt; [root@alt-xfce ~]# strace /lib64/ld-linux-x86-64.so.2 /usr/bin/python3 2&gt;&amp;1
&gt; | grep /usr/bin/python3
&gt; execve(&quot;/lib64/ld-linux-x86-64.so.2&quot;, [&quot;/lib64/ld-linux-x86-64.so.2&quot;,
&gt; &quot;/usr/bin/python3&quot;], 0x7fff7c00c658 /* 45 vars */) = 0
&gt; openat(AT_FDCWD, &quot;/usr/bin/python3&quot;, O_RDONLY|O_CLOEXEC) = 3
&gt; &lt;...&gt;
&gt; [root@alt-xfce ~]# strace /bin/sh /usr/bin/python3 2&gt;&amp;1 | grep

тут должно быть strace /bin/sh -с /usr/bin/python3

Что даёт
execve(&quot;/bin/sh&quot;, [&quot;/bin/sh&quot;, &quot;-c&quot;, &quot;/usr/bin/python&quot;], 0x7ffd0d05fa60 /* 64 vars */) = 0
execve(&quot;/usr/bin/python&quot;, [&quot;/usr/bin/python&quot;], 0x775700 /* 64 vars */) = 0


А в случае запуска через ld-linux, второго exec нет</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193800</commentid>
    <comment_count>5</comment_count>
    <who name="mikhailnov">m</who>
    <bug_when>2020-11-05 15:35:31 +0300</bug_when>
    <thetext>AltHa привязывается к LSM-хукам bprm_set_creds и inode_unlink. А вот в политиках IMA обычно отслеживают bprm_check и mmap_file:
https://en.opensuse.org/SDB:Ima_evm#Configuration_of_the_IMA_Policy_and_dracut_Early_Init

&lt;...&gt;
appraise func=BPRM_CHECK fowner=0 appraise_type=imasig
appraise func=BPRM_CHECK euid=0 appraise_type=imasig
appraise func=FILE_MMAP fowner=0 mask=MAY_EXEC appraise_type=imasig
appraise func=FILE_MMAP euid=0 mask=MAY_EXEC appraise_type=imasig
&lt;...&gt;
Require all files that are directly executed or memory mapped with execute permission to carry a digital signature

При запуске через rtld выполняется mmap с PROT_EXEC 2 раза:

$ strace /lib64/ld-linux-x86-64.so.2 /bin/true 2&gt;&amp;1 | grep mmap | grep PROT_EXEC
mmap(0x7f72dd6ca000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7f72dd6ca000
mmap(0x7f72dd4a5000, 1540096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7f72dd4a5000

Без rtld - один раз:
$ strace /bin/true 2&gt;&amp;1 | grep mmap | grep PROT_EXEC
mmap(0x7f96b4d5f000, 1540096, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7f96b4d5f000

Может быть, в АльтХе стоит ловить mmap с PROT_EXEC, как это делает IMA?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193802</commentid>
    <comment_count>6</comment_count>
    <who name="mikhailnov">m</who>
    <bug_when>2020-11-05 15:41:02 +0300</bug_when>
    <thetext>Может ли быть блокировка mmap() с PROT_EXEC полезна еще чем-то, кроме отсутствия необходимости блокировать rtld как интерпретатор?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193817</commentid>
    <comment_count>7</comment_count>
    <who name="Dmitry V. Levin">ldv</who>
    <bug_when>2020-11-06 02:34:28 +0300</bug_when>
    <thetext>(In reply to Михаил Новоселов from comment #5)
&gt; $ strace /bin/true 2&gt;&amp;1 | grep mmap | grep PROT_EXEC
&gt; mmap(0x7f96b4d5f000, 1540096, PROT_READ|PROT_EXEC,
&gt; MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x25000) = 0x7f96b4d5f000

Меня насторожил этот пример, потому что альтовый /bin/true не использует rtld, и mmap ему делать совершенно незачем.  Но я на всякий случай проверил:
$ env -i strace -v /bin/true
execve(&quot;/bin/true&quot;, [&quot;/bin/true&quot;], [])  = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Наверное, /bin/true не очень подходит в качестве иллюстрации, лучше /bin/cat &lt;/dev/null</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193818</commentid>
    <comment_count>8</comment_count>
    <who name="Anton V. Boyarshinov">boyarsh</who>
    <bug_when>2020-11-06 10:36:24 +0300</bug_when>
    <thetext>
&gt; Может быть, в АльтХе стоит ловить mmap с PROT_EXEC, как это делает IMA?

Я сомневаюсь, что в хуке на mmap удастся отличить запуск бинарника как интерпертатор и прямой запуск.

&gt; необходимости блокировать rtld как интерпретатор?
Вообще говоря, запрет прямого запуска rtld, запуска не в качестве интерпретатора выглядит неплохой идеей для систем, в которых это предполагается использовать.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>193822</commentid>
    <comment_count>9</comment_count>
    <who name="mikhailnov">m</who>
    <bug_when>2020-11-06 11:17:48 +0300</bug_when>
    <thetext>(Ответ для Dmitry V. Levin на комментарий #7)
&gt; Меня насторожил этот пример, потому что альтовый /bin/true не использует
&gt; rtld, и mmap ему делать совершенно незачем.  Но я на всякий случай проверил:
&gt; $ env -i strace -v /bin/true
&gt; execve(&quot;/bin/true&quot;, [&quot;/bin/true&quot;], [])  = 0
&gt; exit_group(0)                           = ?
&gt; +++ exited with 0 +++
&gt; 
&gt; Наверное, /bin/true не очень подходит в качестве иллюстрации, лучше /bin/cat
&gt; &lt;/dev/null

Да, пример был не с Альта, спасибо за уточнение.

(Ответ для Anton V. Boyarshinov на комментарий #8)
&gt; &gt; Может быть, в АльтХе стоит ловить mmap с PROT_EXEC, как это делает IMA?
&gt; 
&gt; Я сомневаюсь, что в хуке на mmap удастся отличить запуск бинарника как
&gt; интерпертатор и прямой запуск.

Разумно. Надо сказать, звучит как повод в rpm автоматически заменять #!/usr/bin/env foo на реальный путь в шебангах.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212981</commentid>
    <comment_count>10</comment_count>
    <who name="mikhailnov">m</who>
    <bug_when>2022-07-20 15:54:02 +0300</bug_when>
    <thetext>Смотрю, в исходниках ядра теперь упомянут ld-linux, но на вики не был. Добавил про него в статью https://www.altlinux.org/AltHa

P.S. В исходниках
https://git.altlinux.org/gears/k/kernel-image-un-def.git?p=kernel-image-un-def.git;a=blob;f=Documentation/admin-guide/LSM/AltHa.rst;h=beda40601c9e72fb1b9ed17e5492a3223a707452;hb=HEAD#l35
кавычки стоят на одно слово правее, чем нужно, мне кажется:
&quot;Adding ld-linux into blocking list prevents running interpreters via ``ld-linux interpreter``&quot;</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>