Comments 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
Но это же не повод! При составлении вопросов на олимпиаде такого уровня, надо же на текущие тенденции смотреть хоть чуть-чуть или хотя бы не давать таких однозначных ответов.
У вас у обоих разрешено выполнение этой команды ото всех пользователей.
rhel 6 и клоны (centos, amazon) — от рута.
Им про это давно говорят. Вот один из первых клаймов. 2008 год, однако.
В Ubuntu 13.04 amd64 ping rws, getcaps $(which ping) выдаёт пустую строку. Дистрибутив этого года, если кто не в курсе. Интересно, что у автора.
ну, судя по этому треду, наиболее популярные дистрибутивы пока это начинание не поддержали.
Тогда у Вас была возможность убедиться, что ping от рута не только в «древней слаке», но и в доброй половине вполне себе современных дистрибутивов. Почему Вы ей не воспользовались?
см. мои комментарии выше
Комментарий выше не в тему.) Дело не в вопросах и ответах, а в тоне вашей критики. Она должна быть конструктивной. А у Вас получилось в стиле обиженного студента.
На всякий случай, я не имею отношения к организаторам олимпиады, просто не хочется, чтобы у них отбили охоту продолжать это дело.
На всякий случай, я не имею отношения к организаторам олимпиады, просто не хочется, чтобы у них отбили охоту продолжать это дело.
Мне просто обидно за ребят, которых отшили на первом же туре просто из-за того, что организаторы… или скопипастили эти вопросы из какого-то замшелого источника, или сами довольно замшелы. Мне за ребят реально обидно. Наверно отсюда и обиженная интонация.
А мои комментарии выше относятся и к разным дебианам и к редхатам… что вам ещё надо? Я понимаю, что есть дистрибутивы, которые меняются очень медленно. Что многие используют второе ядро 2.6 2003-2004 года и до сих пор не пользуются возможностями ядра 2.2 (1999). Но это не повод задавать такие некорректные вопросы, ожидать плоских ответов и оценивать людей по этим критериям. Да. мне обидно.
А мои комментарии выше относятся и к разным дебианам и к редхатам… что вам ещё надо? Я понимаю, что есть дистрибутивы, которые меняются очень медленно. Что многие используют второе ядро 2.6 2003-2004 года и до сих пор не пользуются возможностями ядра 2.2 (1999). Но это не повод задавать такие некорректные вопросы, ожидать плоских ответов и оценивать людей по этим критериям. Да. мне обидно.
Лично я в этом вопросе колебался между ping и sshd и в итоге ответил «sshd». Это не помешало пройти мне в следующий тур.
Вы же прочитали один вопрос, а участников оценивали по всем. Это, мягко говоря, некорректно.
BTW Динара так обычно ругается на себя, когда делает что-то не так.
BTW Динара так обычно ругается на себя, когда делает что-то не так.
Ubuntu 12.04 ядро 3.8, от рута.
michurin, мне почему-то кажется, что вы написали этот пост только для того, чтобы «срубить» рейтинга и кармы.
Почему я так думаю?
Во-первых, потому что вы запостили его, ещё не закончив читать задания, о чём и сказали сами.
Во-вторых, потому что не проверили факты про рута, а посмотрели только на свой дистрибутив.
В-третьих, потому что не посмотрели ответы, где варианта, с которым можно перепутать, просто нет.
В-четвёртых, потому что вместо комментария «Поздравляю победителей. И отвечаю на пост постом.» можно было написать как раз вопрос по делу. И обсуждение шло бы в одной ветке.
Ну и, наконец, если бы вашей целью было помочь тем, кто развивает Linux, вы бы прошлись по всем файлам и указали, что, по-вашему, неточно или не до конца верно, исходя, видимо, из обширной практики. И вот это дало бы конкретную практическую пользу.
Спасибо.
Почему я так думаю?
Во-первых, потому что вы запостили его, ещё не закончив читать задания, о чём и сказали сами.
Во-вторых, потому что не проверили факты про рута, а посмотрели только на свой дистрибутив.
В-третьих, потому что не посмотрели ответы, где варианта, с которым можно перепутать, просто нет.
В-четвёртых, потому что вместо комментария «Поздравляю победителей. И отвечаю на пост постом.» можно было написать как раз вопрос по делу. И обсуждение шло бы в одной ветке.
Ну и, наконец, если бы вашей целью было помочь тем, кто развивает Linux, вы бы прошлись по всем файлам и указали, что, по-вашему, неточно или не до конца верно, исходя, видимо, из обширной практики. И вот это дало бы конкретную практическую пользу.
Спасибо.
Вы так думаете потому, что работаете в КРОК ,-)
Поверьте, когда у человека есть семья, интересная работа и богатый досуг, он не будет особо заморачиваться о карме, читать все вопросы, если уже первый очевидно дурацкий, писать длинные посты и бесконечные ответы.
Счастья вам.
Поверьте, когда у человека есть семья, интересная работа и богатый досуг, он не будет особо заморачиваться о карме, читать все вопросы, если уже первый очевидно дурацкий, писать длинные посты и бесконечные ответы.
Счастья вам.
Да вы ещё и специалист по связям со СМИ?! тогда, возможно, вы даже так и не думаете :-)
В любом случае, я рад, что получился топик добра — все комментарии заплюсованы и никто не ушёл обиженным :-)
В любом случае, я рад, что получился топик добра — все комментарии заплюсованы и никто не ушёл обиженным :-)
Ubuntu 13.10, аналогично, но ping все равно не от рута, а sshd — от него :)
Про sshd я тоже хотел написать.
Что они имеют ввиду, когда спрашивают «от рута ли sshd?» Ответ-то не однозначный. Основной процесс всяко от рута. Дочки от пользователей. Если залогинился рут, то и дочка от рута… Вопрос в высшей степени некорректный.
Там всё такое. И screen под большим вопросом… И тогда уж надо было в этот список mount включать…
Что они имеют ввиду, когда спрашивают «от рута ли 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 даже исключили часть, которая была таким тестом, так как все сдающие признали ее пустой тратой времени.
suid bit есть, capabilities не заданы, судя по ps работает от юзера.
Открывает сокет и делает setuid.
То есть, он от рута он конечно работает, но недолго (также как login и sshd).
Открывает сокет и делает 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)
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 бит все таки слишком опасен, и если можно как-то обойтись без него — то это было бы лучше.
Поэтому 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
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]
Использовать backticks нехорошо.
[zanuda mode off]
Что это? Оно должно показать, что ping в другом эмуляторе терминала работает от пользователя root? Нет, поскольку ps не показывает effective UID по умолчанию, а чтобы его показать, нужно сменить формат вывода ps…
[спустя 20 минут]
Узнал кое-что новое о ping.
Версия iputils-ping в Debian Jessie (s20121221) способна работать как с использованием suid bit, так и с использованием capabilities. Причём работа с повышенными привилегиями длится очень недолгое время.
Если препроцессор видит определённым макрос CAPABILITES, он использует версию с capabilites, иначе — с setuid: codeo.me/2Ta
Так или иначе, мы не успеем увидеть, какие именно привелегии использует ping — время их использования очень мало.
Да, задание не слишком корректное. Однако в целом конкурс полезный, на мой взгляд.
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 же, ну!).
Использовать backticks нехорошо.
Почему, интересно?
Во-первых, это исторически первый, кривоватый, способ вызова программы. В то же время доллар и скобки — новая POSIX-форма, то есть стандартизованная.
Во-вторых, читать и понимать backticks гораздо сложнее, особенно вложенные.
Вот обсуждение на SO:
stackoverflow.com/a/9406350/1145239
И небольшая статья:
partmaps.org/era/unix/award-example-backticks.html
Во-вторых, читать и понимать backticks гораздо сложнее, особенно вложенные.
Вот обсуждение на SO:
stackoverflow.com/a/9406350/1145239
И небольшая статья:
partmaps.org/era/unix/award-example-backticks.html
А объясните, пожалуйста, дураку: зачем пинг скрывать от пользователя? Что такого может наделать эта программулина, что запускать её только от рута?
Всё наоборот: никто ничего не пытается скрывать от пользователя, но стараются ограничить доступ утилиты ping до привилегий рута. Ошибки есть в любом ПО, и никто не даст гарантии, что через ping нельзя эскалировать привилегии в системе.
Всё не так :-)
Пинг можно запускать от пользователя.
Для работы ему нужны низкоуровневые сокеты (raw).
Простому пользователю к ним доступ закрыт (ибо нефиг :-))
Поэтому пинг выполняется с правами суперпользователя.
Но запускать его простой пользователь может. Никто пинг не скрывает.
Но никому не нравится, что простой пользователь может запускать что-то с правами суперпользователя. Чтобы от этого избавиться, придумано несколько обходных путей. Они-то тут и обсуждаются :-)
Пинг можно запускать от пользователя.
Для работы ему нужны низкоуровневые сокеты (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
$ 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) добавляет новый головняк:
Далее, поскольку многие разработчики софта не озаботились добавить поддержку 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-ный софт и даёт намного большую гибкость и эффект для безопасности.
- разработчикам нужно поддерживать в своих приложениях и 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-ный софт и даёт намного большую гибкость и эффект для безопасности.
Sign up to leave a comment.
Re: Отчёт и задания со всероссийской олимпиады по администрированию Linux-систем