Как стать автором
Обновить

Комментарии 52

Зачет! Настоящий ИТ-специалист должен разбираться с текущей проблемой, уметь анализировать и не должен все знать наизусть. Он лишь должен четко знать как настроить доступ в инет )
Ну вот в плане безопасности, в отличие от обычного админства, важно заранее знать. Это в обычно админстве «вроде работает» — значит, все окей, а в секьюрити — дырявая система может работать еще бодрей и веселей, чем секурная.
НЛО прилетело и опубликовало эту надпись здесь
Большое спасибо, а то я уже посыпал голову пеплом, и с позором пошел читать маны на эту тему.
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
Да. Печально. У меня под рукой есть совсем свеженький дебиан и там такая же ерунда.

$ 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

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

Это значит, что стоит suid-бит и программа, кем бы ни была запущена, будет исполнена с правами владельца. То есть в данном случае — root'a.
как тогда понять такое? (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
rhel 6 и клоны (centos, amazon) — от рута.
В Ubuntu 13.04 amd64 ping rws, getcaps $(which ping) выдаёт пустую строку. Дистрибутив этого года, если кто не в курсе. Интересно, что у автора.
У автора чего только нет (по всей стране и за рубежами :-)), но на рабочей машинке 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
ну, судя по этому треду, наиболее популярные дистрибутивы пока это начинание не поддержали.
Тогда у Вас была возможность убедиться, что ping от рута не только в «древней слаке», но и в доброй половине вполне себе современных дистрибутивов. Почему Вы ей не воспользовались?
см. мои комментарии выше
Комментарий выше не в тему.) Дело не в вопросах и ответах, а в тоне вашей критики. Она должна быть конструктивной. А у Вас получилось в стиле обиженного студента.
На всякий случай, я не имею отношения к организаторам олимпиады, просто не хочется, чтобы у них отбили охоту продолжать это дело.
Мне просто обидно за ребят, которых отшили на первом же туре просто из-за того, что организаторы… или скопипастили эти вопросы из какого-то замшелого источника, или сами довольно замшелы. Мне за ребят реально обидно. Наверно отсюда и обиженная интонация.

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

BTW Динара так обычно ругается на себя, когда делает что-то не так.
Ubuntu 12.04 ядро 3.8, от рута.
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.
см в конце поста:
у меня ping от рута; ls -l `which ping` ⇒ -rws--x--x

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

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

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

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

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

Там всё такое. И screen под большим вопросом… И тогда уж надо было в этот список mount включать…
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
Вопрос некорректный, но было абсолютно понятно, что задающие имеют в виду. Ответ напрашивался сразу.
Кстати, как довольно опытный пользователь и администратор локалхоста замечу организаторам олимпиады: хоть Линуксом я пользуюсь с прошлого века, все эти опции ядра и флаги выводов я не помню и не запоминаю принципиально: во-первых, это скучно, во-вторых их много и они меняются, в третьих, они всегда есть в документации или в интернете.

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

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

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

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

НЛО прилетело и опубликовало эту надпись здесь
[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 — время их использования очень мало.

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

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

Так в дебиане версия собрана с включенным CAPABILITIES или с выключенным?
$ 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 же, ну!).
Соответственно, глядя на вызов — собран с CAPABILITIES.

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

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

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

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

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

Но никому не нравится, что простой пользователь может запускать что-то с правами суперпользователя. Чтобы от этого избавиться, придумано несколько обходных путей. Они-то тут и обсуждаются :-)
У меня так
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

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
Всё совсем не так однозначно. С одной стороны, избавление от 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-ный софт и даёт намного большую гибкость и эффект для безопасности.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории