Re: Отчёт и задания со всероссийской олимпиады по администрированию Linux-систем

    Тут появился интересная заметка про subj. Первый же вопрос первого тура поставил меня в тупик. Даже не столько вопрос, сколько правильный ответ организаторов. Оказывается ping у них выполняется от рута. На моей системе это не так. Уверен, что если вы пользуетесь достаточно современной системой, то и у вас ping выполняется не от рута.

    Дело в том, что в Linux ещё с прошлого тысячелетия(!) существует такая штука, как capabilities. В man capabilities написано так мало, что даже и пересказать-то нечего: с помощью команды setcap можно устанавливать исполняемым файлам права на испольование разных подсистем без рутовых прав. В частности, для ping достаточно только прав CAP_NET_RAW. Существует масса подборок советов, как избавиться от suid-бита для различных системных программ.

    Жаль, что люди, которые пользуются современными системами и держат руку на пульсе развития Linux, не имели ни единого шанса пройти даже первый тур этой олимпиады.

    Динара Сафина, первая ракетка мира, между прочим, (фотка отсюда) тоже потрясена.

    Всем счастливой пятницы!



    Остальные вопросы я не читал, наверняка там тоже много интересного, не проходите мимо.

    Для справки, полное досье на мой пинг:

    $ ls -l /usr/bin/ping
    -rwxr-xr-x 1 root root 40032 авг 13 18:56 /usr/bin/ping
    $ getcap /usr/bin/ping
    /usr/bin/ping = cap_net_raw+ep

    А вот древняя слака:

    $ ls -l /bin/ping
    -rws--x--x 1 root root 29364 2006-08-14 02:20 /bin/ping*
    $ getcap /bin/ping
    -bash: getcap: command not found
    $ uname -r # хотя ядро там эту фичу уже поддерживает
    2.6.30.6
    

    UPD: hipp и другие пользователи, которые ro на хабре и пишут мне на моём сайте: я не знаю, как вам ответить :-) Если вы хотите, чтобы я вам ответил, оставляйте что-нибудь кроме хабраников или просто пишите мене на почту. Спасибо за резонанс.

    UPD: alizar намекает мне, что Динара Сафина завершила карьеру в 2011. Но (это уже от меня) она всё равно молодец! :-) А ядро 2.2 вышло в 1999 году, а многие этого не заметили до сих пор.

    UPD (важный): в почту мне пишут, что уже года с 2010 в Linux (ядре) есть так называемые ping-socket, реализованные нашим соотечественником (Василий Куликов из Openwall). Я посмотрел, про это, оказывается есть man 7 icmp у меня в /proc торчит даже для него интерфейс /proc/sys/net/ipv4/icmp_*. Кому интересно, можно начать гуглёж со слов «userspace ping utility».

    Спасибо, Сергей! Пятница прожита не зря!

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    ps auxwww | grep ping | grep -v grep # ну как? от рута на вашей системе ping?
    Поделиться публикацией
    Комментарии 52
      +8
      Зачет! Настоящий ИТ-специалист должен разбираться с текущей проблемой, уметь анализировать и не должен все знать наизусть. Он лишь должен четко знать как настроить доступ в инет )
        0
        Ну вот в плане безопасности, в отличие от обычного админства, важно заранее знать. Это в обычно админстве «вроде работает» — значит, все окей, а в секьюрити — дырявая система может работать еще бодрей и веселей, чем секурная.
          0
          В плане безопасности зарание знать и настроить вообще не реально. Тут жизненно необходимо держать руку на пульсе и мониторить интернет каждую неделю на информацию о новых зависимостях.
        +7
        Большое спасибо, а то я уже посыпал голову пеплом, и с позором пошел читать маны на эту тему.
          +6
          debian 6
          banshee:~> ls -l `which ping`
          -rwsr-xr-x 1 root root 31360 Окт 14  2010 /bin/ping
          banshee:~> getcap `which ping`
          getcap: Command not found.
          banshee:~> uname -r
          2.6.32-5-686
          
            +3
            Да. Печально. У меня под рукой есть совсем свеженький дебиан и там такая же ерунда.

            $ cat /etc/debian_version 
            7.2
            $ uname -r
            2.6.32-042stab076.8
            $ ls -l `which ping`
            -rwsr-xr-x 1 root root 36136 Апр 12  2011 /bin/ping

            Но это же не повод! При составлении вопросов на олимпиаде такого уровня, надо же на текущие тенденции смотреть хоть чуть-чуть или хотя бы не давать таких однозначных ответов.
              0
              У вас у обоих разрешено выполнение этой команды ото всех пользователей.
                +4
                Речь не о том, кому можно запускать, а о том, с чьими правами выполняться будет.
                -rwsr-xr-x 1 root root

                Это значит, что стоит suid-бит и программа, кем бы ни была запущена, будет исполнена с правами владельца. То есть в данном случае — root'a.
                  0
                  как тогда понять такое? (OpenSuse 11.4, 3.10.10)

                  > ls -l `which ping`
                  -rwsr-xr-x 1 root root 39016 Фев 23 2011 /bin/ping

                  > ps auxwww | grep ping | grep -v grep
                  shc 25010 0.0 0.0 2020 544 pts/1 S+ 17:12 0:00 ping ya.ru
          +1
          rhel 6 и клоны (centos, amazon) — от рута.
          +4
          В Ubuntu 13.04 amd64 ping rws, getcaps $(which ping) выдаёт пустую строку. Дистрибутив этого года, если кто не в курсе. Интересно, что у автора.
            +2
            У автора чего только нет (по всей стране и за рубежами :-)), но на рабочей машинке Arch
            $ uname -a
            Linux m 3.12.1-3-ARCH #1 SMP PREEMPT Tue Nov 26 11:17:02 CET 2013 x86_64 GNU/Linux
              0
              ну, судя по этому треду, наиболее популярные дистрибутивы пока это начинание не поддержали.
                +3
                Тогда у Вас была возможность убедиться, что ping от рута не только в «древней слаке», но и в доброй половине вполне себе современных дистрибутивов. Почему Вы ей не воспользовались?
                  0
                  см. мои комментарии выше
                    +5
                    Комментарий выше не в тему.) Дело не в вопросах и ответах, а в тоне вашей критики. Она должна быть конструктивной. А у Вас получилось в стиле обиженного студента.
                    На всякий случай, я не имею отношения к организаторам олимпиады, просто не хочется, чтобы у них отбили охоту продолжать это дело.
                      +1
                      Мне просто обидно за ребят, которых отшили на первом же туре просто из-за того, что организаторы… или скопипастили эти вопросы из какого-то замшелого источника, или сами довольно замшелы. Мне за ребят реально обидно. Наверно отсюда и обиженная интонация.

                      А мои комментарии выше относятся и к разным дебианам и к редхатам… что вам ещё надо? Я понимаю, что есть дистрибутивы, которые меняются очень медленно. Что многие используют второе ядро 2.6 2003-2004 года и до сих пор не пользуются возможностями ядра 2.2 (1999). Но это не повод задавать такие некорректные вопросы, ожидать плоских ответов и оценивать людей по этим критериям. Да. мне обидно.
                        +1
                        Лично я в этом вопросе колебался между ping и sshd и в итоге ответил «sshd». Это не помешало пройти мне в следующий тур.
                          +1
                          Вы же прочитали один вопрос, а участников оценивали по всем. Это, мягко говоря, некорректно.

                          BTW Динара так обычно ругается на себя, когда делает что-то не так.
                            0
                            Ubuntu 12.04 ядро 3.8, от рута.
                              0
                              Linux pyxis-server 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 15:31:16 UTC 2013 i686 i686 i386 GNU/Linux
                              От запустившего (не от рута).
                              В олимпиаде отвечал sshd.
                                0
                                см в конце поста:
                                у меня ping от рута; ls -l `which ping` ⇒ -rws--x--x

                                то что процесс от запустившего юзера, ничего не значит.
                            +9
                            michurin, мне почему-то кажется, что вы написали этот пост только для того, чтобы «срубить» рейтинга и кармы.
                            Почему я так думаю?
                            Во-первых, потому что вы запостили его, ещё не закончив читать задания, о чём и сказали сами.
                            Во-вторых, потому что не проверили факты про рута, а посмотрели только на свой дистрибутив.
                            В-третьих, потому что не посмотрели ответы, где варианта, с которым можно перепутать, просто нет.
                            В-четвёртых, потому что вместо комментария «Поздравляю победителей. И отвечаю на пост постом.» можно было написать как раз вопрос по делу. И обсуждение шло бы в одной ветке.
                            Ну и, наконец, если бы вашей целью было помочь тем, кто развивает Linux, вы бы прошлись по всем файлам и указали, что, по-вашему, неточно или не до конца верно, исходя, видимо, из обширной практики. И вот это дало бы конкретную практическую пользу.
                            Спасибо.
                              0
                              Вы так думаете потому, что работаете в КРОК ,-)

                              Поверьте, когда у человека есть семья, интересная работа и богатый досуг, он не будет особо заморачиваться о карме, читать все вопросы, если уже первый очевидно дурацкий, писать длинные посты и бесконечные ответы.

                              Счастья вам.
                                +2
                                Да вы ещё и специалист по связям со СМИ?! тогда, возможно, вы даже так и не думаете :-)

                                В любом случае, я рад, что получился топик добра — все комментарии заплюсованы и никто не ушёл обиженным :-)
                        +1
                        Ubuntu 13.10, аналогично, но ping все равно не от рута, а sshd — от него :)
                          +4
                          Про sshd я тоже хотел написать.

                          Что они имеют ввиду, когда спрашивают «от рута ли sshd?» Ответ-то не однозначный. Основной процесс всяко от рута. Дочки от пользователей. Если залогинился рут, то и дочка от рута… Вопрос в высшей степени некорректный.

                          Там всё такое. И screen под большим вопросом… И тогда уж надо было в этот список mount включать…
                        +2
                        Debian 8.
                        $ ls -l /bin/ping
                        -rwsr-xr-x 1 root root 39928 May 15  2013 /bin/ping
                        $ getcap /bin/ping
                        $ cat /etc/debian_version
                        jessie/sid
                        $ uname -r
                        3.11-2-amd64
                          +4
                          Вопрос некорректный, но было абсолютно понятно, что задающие имеют в виду. Ответ напрашивался сразу.
                            +10
                            Кстати, как довольно опытный пользователь и администратор локалхоста замечу организаторам олимпиады: хоть Линуксом я пользуюсь с прошлого века, все эти опции ядра и флаги выводов я не помню и не запоминаю принципиально: во-первых, это скучно, во-вторых их много и они меняются, в третьих, они всегда есть в документации или в интернете.

                            В экзамене RHCE даже исключили часть, которая была таким тестом, так как все сдающие признали ее пустой тратой времени.
                              0
                              в RHCE вопросы на флаги могут проверять быстроту листания man, а какие условия прохождения этого отборочного тура я пока не понял.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                suid bit есть, capabilities не заданы, судя по ps работает от юзера.
                                Открывает сокет и делает setuid.
                                То есть, он от рута он конечно работает, но недолго (также как login и sshd).
                                  0
                                  и на ваш опрос мне ответить нечего,
                                  ls -l `which ping` ⇒ -rws--x--x, getcap `which ping` = пустая строка, но ps auxwww | grep ping | grep -v grep — от пользователя.

                                  Ubuntu 10.04 LTS (i686)
                                    –3
                                    Почему вы думаете, что недолго? Я вот cat /bin/ping сделал — там все как-то сложно, кракозябры — непонятно долго или нет. Предположение(!) о том, что недолго можно сделать из наших знаний о том, что может работать недолго. Но как на самом деле? Что если сделали его не очень эффективно? Или есть баг, в результате которого он при редких условиях, раз в сто лет (и в 100% случаях, при редких условиях, которые взломщик создаст) будет под рутом работать? Или вообще кто-то сделал mv /home/hacker/malware /bin/ping и suid'ный бит дает малвари возможность творить все, что угодно.

                                    Поэтому suid бит все таки слишком опасен, и если можно как-то обойтись без него — то это было бы лучше.
                                    +3
                                    Обычная Федорка

                                    ls -l /bin/ping
                                    -rwxr-xr-x. 1 root root 45656 фев 1 2013 /bin/ping

                                    getcap /bin/ping
                                    /bin/ping = cap_net_admin,cap_net_raw+ep

                                    uname -a
                                    Linux NP305 3.11.9-200.fc19.x86_64 #1 SMP Wed Nov 20 21:22:24 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

                                    +1
                                    [zanuda mode on]
                                    ls -l `which ping`
                                    getcap `which ping`

                                    Использовать backticks нехорошо.
                                    [zanuda mode off]

                                    ps auxwww | grep ping | grep -v grep

                                    Что это? Оно должно показать, что ping в другом эмуляторе терминала работает от пользователя root? Нет, поскольку ps не показывает effective UID по умолчанию, а чтобы его показать, нужно сменить формат вывода ps…

                                    [спустя 20 минут]

                                    Узнал кое-что новое о ping.
                                    Версия iputils-ping в Debian Jessie (s20121221) способна работать как с использованием suid bit, так и с использованием capabilities. Причём работа с повышенными привилегиями длится очень недолгое время.
                                    	enable_capability_raw();
                                    
                                    	icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
                                    	socket_errno = errno;
                                    
                                    	disable_capability_raw();
                                            /* ... */
                                    			enable_capability_raw();
                                    			rc = setsockopt(probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)+1);
                                    			disable_capability_raw();
                                    
                                    

                                    Если препроцессор видит определённым макрос CAPABILITES, он использует версию с capabilites, иначе — с setuid: codeo.me/2Ta
                                    Так или иначе, мы не успеем увидеть, какие именно привелегии использует ping — время их использования очень мало.

                                    Да, задание не слишком корректное. Однако в целом конкурс полезный, на мой взгляд.
                                      0
                                      Версия iputils-ping в Debian Jessie (s20121221) способна работать как с использованием suid bit, так и с использованием capabilities.

                                      Если препроцессор видит определённым макрос CAPABILITES, он использует версию с capabilites, иначе — с setuid

                                      Так в дебиане версия собрана с включенным CAPABILITIES или с выключенным?
                                        +1
                                        $ apt-cache show iputils-ping | egrep -e '^(Version|Depends)'
                                        Version: 3:20121221-1
                                        Depends: libc6 (>= 2.14), libcap2 (>= 2.10), libgnutls-openssl27


                                        Далее:
                                        strace по стоковому ping
                                        [pid  9707] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
                                        [pid  9707] capget({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, 0}) = 0
                                        [pid  9707] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
                                        [pid  9707] capset({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9707] prctl(PR_SET_KEEPCAPS, 1)   = 0
                                        [pid  9707] getuid()                    = 1000
                                        [pid  9707] setuid(1000)                = 0
                                        [pid  9707] prctl(PR_SET_KEEPCAPS, 0)   = 0
                                        [pid  9707] getuid()                    = 1000
                                        [pid  9707] geteuid()                   = 1000
                                        [pid  9707] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
                                        [pid  9707] capget({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9707] capset({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_NET_RAW, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9707] socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
                                        [pid  9707] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
                                        [pid  9707] capget({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_NET_RAW, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9707] capset({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9707] socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
                                        [pid  9707] connect(4, {sa_family=AF_INET, sin_port=htons(1025), sin_addr=inet_addr("8.8.8.8")}, 16) = 0
                                        [pid  9707] getsockname(4, {sa_family=AF_INET, sin_port=htons(61820), sin_addr=inet_addr("x.x.x.x")}, [16]) = 0
                                        [pid  9707] close(4)                    = 0
                                        [pid  9707] setsockopt(3, SOL_IP, IP_MTU_DISCOVER, [2], 4) = 0
                                        [pid  9707] setsockopt(3, SOL_RAW, ICMP_FILTER, ~(ICMP_ECHOREPLY|ICMP_DEST_UNREACH|ICMP_SOURCE_QUENCH|ICMP_REDIRECT|ICMP_TIME_EXCEEDED|ICMP_PARAMETERPROB), 4) = 0
                                        [pid  9707] setsockopt(3, SOL_IP, IP_RECVERR, [1], 4) = 0
                                        [pid  9707] setsockopt(3, SOL_SOCKET, SO_SNDBUF, [268], 4) = 0
                                        [pid  9707] setsockopt(3, SOL_SOCKET, SO_RCVBUF, [65536], 4) = 0
                                        [pid  9707] getsockopt(3, SOL_SOCKET, SO_RCVBUF, [131072], [4]) = 0
                                        [pid  9707] fstat(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
                                        [pid  9707] ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff5cc2eff0) = -1 ENOTTY (Inappropriate ioctl for device)
                                        [pid  9707] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f3359eb2000
                                        [pid  9707] setsockopt(3, SOL_SOCKET, SO_TIMESTAMP, [1], 4) = 0
                                        [pid  9707] setsockopt(3, SOL_SOCKET, SO_SNDTIMEO, "\0\0\0\0\0\0\0\0\340\223\4\0\0\0\0\0", 16) = 0
                                        [pid  9707] setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, "\0\0\0\0\0\0\0\0\340\223\4\0\0\0\0\0", 16) = 0
                                        [pid  9707] getpid()                    = 9707
                                        [pid  9707] rt_sigaction(SIGINT, {0x404320, [], SA_RESTORER|SA_INTERRUPT, 0x7f3359719250}, NULL, 8) = 0
                                        [pid  9707] rt_sigaction(SIGALRM, {0x404320, [], SA_RESTORER|SA_INTERRUPT, 0x7f3359719250}, NULL, 8) = 0
                                        [pid  9707] rt_sigaction(SIGQUIT, {0x404310, [], SA_RESTORER|SA_INTERRUPT, 0x7f3359719250}, NULL, 8) = 0
                                        [pid  9707] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
                                        [pid  9707] ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff5cc2f510) = -1 ENOTTY (Inappropriate ioctl for device)
                                        [pid  9707] sendmsg(3, {msg_name(16)={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("8.8.8.8")}, msg_iov(1)=[{"\10\0\322\23%\353\0\1", 8}], msg_controllen=0, msg_flags=0}, 0) = 8
                                        [pid  9707] setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
                                        [pid  9707] recvmsg(3, {msg_name(16)={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("8.8.8.8")}, msg_iov(1)=[{"E\0\0\34\0\0\0\0.\1\277\24\10\10\10\10Y\263d\n\0\0\332\23%\353\0\1", 136}], msg_controllen=32, {cmsg_len=32, cmsg_level=SOL_SOCKET, cmsg_type=0x1d /* SCM_??? */, ...}, msg_flags=0}, 0) = 28
                                        [pid  9707] write(1, "PING 8.8.8.8 (8.8.8.8) 0(28) bytes of data.\n8 bytes from 8.8.8.8: icmp_seq=1 ttl=46\n", 84) = 84
                                        [pid  9707] write(1, "\n", 1)           = 1
                                        [pid  9707] write(1, "--- 8.8.8.8 ping statistics ---\n1 packets transmitted, 1 received, 0% packet loss, time 0ms\n\n", 93) = 93
                                        [pid  9707] exit_group(0)               = ?
                                        [pid  9707] +++ exited with 0 +++
                                        strace по ping с выключенным suid и включенными cap_net_admin + cap_net_raw
                                        [pid  9760] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
                                        [pid  9760] capget({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_NET_ADMIN|CAP_NET_RAW, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9760] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
                                        [pid  9760] capset({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9760] prctl(PR_SET_KEEPCAPS, 1)   = 0
                                        [pid  9760] getuid()                    = 1000
                                        [pid  9760] setuid(1000)                = 0
                                        [pid  9760] prctl(PR_SET_KEEPCAPS, 0)   = 0
                                        [pid  9760] getuid()                    = 1000
                                        [pid  9760] geteuid()                   = 1000
                                        [pid  9760] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
                                        [pid  9760] capget({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9760] capset({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_NET_RAW, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9760] socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
                                        [pid  9760] capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
                                        [pid  9760] capget({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_NET_RAW, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9760] capset({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0
                                        [pid  9760] socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
                                        [pid  9760] connect(4, {sa_family=AF_INET, sin_port=htons(1025), sin_addr=inet_addr("8.8.8.8")}, 16) = 0
                                        [pid  9760] getsockname(4, {sa_family=AF_INET, sin_port=htons(51535), sin_addr=inet_addr("x.x.x.x")}, [16]) = 0
                                        [pid  9760] close(4)                    = 0
                                        [pid  9760] setsockopt(3, SOL_IP, IP_MTU_DISCOVER, [2], 4) = 0
                                        [pid  9760] setsockopt(3, SOL_RAW, ICMP_FILTER, ~(ICMP_ECHOREPLY|ICMP_DEST_UNREACH|ICMP_SOURCE_QUENCH|ICMP_REDIRECT|ICMP_TIME_EXCEEDED|ICMP_PARAMETERPROB), 4) = 0
                                        [pid  9760] setsockopt(3, SOL_IP, IP_RECVERR, [1], 4) = 0
                                        [pid  9760] setsockopt(3, SOL_SOCKET, SO_SNDBUF, [268], 4) = 0
                                        [pid  9760] setsockopt(3, SOL_SOCKET, SO_RCVBUF, [65536], 4) = 0
                                        [pid  9760] getsockopt(3, SOL_SOCKET, SO_RCVBUF, [131072], [4]) = 0
                                        [pid  9760] fstat(1, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
                                        [pid  9760] ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff3956ed70) = -1 ENOTTY (Inappropriate ioctl for device)
                                        [pid  9760] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb83f4d5000
                                        [pid  9760] setsockopt(3, SOL_SOCKET, SO_TIMESTAMP, [1], 4) = 0
                                        [pid  9760] setsockopt(3, SOL_SOCKET, SO_SNDTIMEO, "\0\0\0\0\0\0\0\0\340\223\4\0\0\0\0\0", 16) = 0
                                        [pid  9760] setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, "\0\0\0\0\0\0\0\0\340\223\4\0\0\0\0\0", 16) = 0
                                        [pid  9760] getpid()                    = 9760
                                        [pid  9760] rt_sigaction(SIGINT, {0x404320, [], SA_RESTORER|SA_INTERRUPT, 0x7fb83ed3c250}, NULL, 8) = 0
                                        [pid  9760] rt_sigaction(SIGALRM, {0x404320, [], SA_RESTORER|SA_INTERRUPT, 0x7fb83ed3c250}, NULL, 8) = 0
                                        [pid  9760] rt_sigaction(SIGQUIT, {0x404310, [], SA_RESTORER|SA_INTERRUPT, 0x7fb83ed3c250}, NULL, 8) = 0
                                        [pid  9760] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
                                        [pid  9760] ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7fff3956f290) = -1 ENOTTY (Inappropriate ioctl for device)
                                        [pid  9760] sendmsg(3, {msg_name(16)={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("8.8.8.8")}, msg_iov(1)=[{"\10\0\321\336& \0\1", 8}], msg_controllen=0, msg_flags=0}, 0) = 8
                                        [pid  9760] setitimer(ITIMER_REAL, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
                                        [pid  9760] recvmsg(3, {msg_name(16)={sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("8.8.8.8")}, msg_iov(1)=[{"E\0\0\34\0\0\0\0.\1\277\24\10\10\10\10Y\263d\n\0\0\331\336& \0\1", 136}], msg_controllen=32, {cmsg_len=32, cmsg_level=SOL_SOCKET, cmsg_type=0x1d /* SCM_??? */, ...}, msg_flags=0}, 0) = 28
                                        [pid  9760] write(1, "PING 8.8.8.8 (8.8.8.8) 0(28) bytes of data.\n8 bytes from 8.8.8.8: icmp_seq=1 ttl=46\n", 84) = 84
                                        [pid  9760] write(1, "\n", 1)           = 1
                                        [pid  9760] write(1, "--- 8.8.8.8 ping statistics ---\n1 packets transmitted, 1 received, 0% packet loss, time 0ms\n\n", 93) = 93
                                        [pid  9760] exit_group(0)               = ?
                                        [pid  9760] +++ exited with 0 +++

                                        По сути, разницы никакой, кроме того, что в режиме setuid процесс получает всю пачку привилегий (root же, ну!).
                                          +1
                                          Соответственно, глядя на вызов — собран с CAPABILITIES.

                                          Я это просто к тому, что какой именно кусок использовать выбирается во время компиляции. Если дебиановскую версию ping запустить на ядре без поддержки capabilities, то работать не будет, и suid bit не поможет.
                                        0
                                        Использовать backticks нехорошо.

                                        Почему, интересно?
                                          +2
                                          Во-первых, это исторически первый, кривоватый, способ вызова программы. В то же время доллар и скобки — новая POSIX-форма, то есть стандартизованная.
                                          Во-вторых, читать и понимать backticks гораздо сложнее, особенно вложенные.

                                          Вот обсуждение на SO:
                                          stackoverflow.com/a/9406350/1145239
                                          И небольшая статья:
                                          partmaps.org/era/unix/award-example-backticks.html
                                        0
                                        А объясните, пожалуйста, дураку: зачем пинг скрывать от пользователя? Что такого может наделать эта программулина, что запускать её только от рута?

                                          +1
                                          Всё наоборот: никто ничего не пытается скрывать от пользователя, но стараются ограничить доступ утилиты ping до привилегий рута. Ошибки есть в любом ПО, и никто не даст гарантии, что через ping нельзя эскалировать привилегии в системе.
                                            0
                                            Ясно. Спасибо!
                                            +4
                                            Всё не так :-)

                                            Пинг можно запускать от пользователя.
                                            Для работы ему нужны низкоуровневые сокеты (raw).
                                            Простому пользователю к ним доступ закрыт (ибо нефиг :-))
                                            Поэтому пинг выполняется с правами суперпользователя.
                                            Но запускать его простой пользователь может. Никто пинг не скрывает.

                                            Но никому не нравится, что простой пользователь может запускать что-то с правами суперпользователя. Чтобы от этого избавиться, придумано несколько обходных путей. Они-то тут и обсуждаются :-)
                                            +1
                                            У меня так
                                            test # ls -l `which ping`
                                            -rws--x--x 1 root root 40464 янв.  31  2013 /bin/ping
                                            test # getcap `which ping`
                                            test # uname -anr
                                            Linux test 3.9.7-gentoo #1 SMP PREEMPT Thu Jun 27 03:56:35 UTC 2013 i686 Pentium(R) Dual-Core CPU E5800 @ 3.20GHz GenuineIntel GNU/Linux
                                            
                                            
                                              0
                                              Ubuntu 13.04

                                              $ ls -l /bin/ping
                                              -rwsr-xr-x 1 root root 34780 окт. 3 2012 /bin/ping
                                              $ uname -r
                                              3.8.0-34-generic
                                                +4
                                                Всё совсем не так однозначно. С одной стороны, избавление от SUID это хорошая идея увеличивающая безопасность. С другой — использование capabilities(7) добавляет новый головняк:
                                                • разработчикам нужно поддерживать в своих приложениях и SUID и capabiilites,
                                                • админам нужно жёстко контролировать не только SUID-ные бинарники (что многие уже привыкли делать и что поддерживают многие стандартные тулзы) но и не-SUID-ные бинарники которым выделены дополнительные capabilities (и которые ещё надо научиться отслеживать).

                                                Далее, поскольку многие разработчики софта не озаботились добавить поддержку capabilities в свои приложения, патчи для этого нужно писать (и поддерживать) разработчикам дистрибутивов — если они хотят избавиться от SUID-ных бинарников. Как вы догадываетесь, эта идея их не сильно возбуждает.

                                                Что мы имеем в результате? Например, в Hardened Gentoo на обычной рабочей станции установлено 23 пакета с SUID-ными бинарниками. Если включить поддержку capabilities, то только 3 из них полностью переключаются с SUID на capabilities. Учитывая дополнительный головняк с необходимостью контролировать бинарники с дополнительными capabilities (что большинство делать не будет) безопасность системы от этого скорее уменьшается, а не увеличивается. Причём ситуация находится в таком состоянии уже несколько лет, и не улучшается (в смысле, разработчики софта не торопятся добавлять поддержку capalibites). Поэтому безопаснее отключить в ядре поддержку FS_SECURITY и забыть про capabilities(7).

                                                Что же касается увеличения безопасности SUID-ных бинарников, то текущий подход к этому заключается не в использовании capabilities, а в использовании RBAC (вроде встроенного в GrSecurity, или SeLinux или RSBAC) с детальным прописыванием что можно и что нельзя делать SUID-ным (и обычным) бинарникам. Это сложнее чем capabilites, но не требует патчить SUID-ный софт и даёт намного большую гибкость и эффект для безопасности.

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                Самое читаемое