Socket Layer
От: euphoria
На: 15-12-2004@11:33 GMT+2
Оценка: 1/НеутраленОсвен бъга в IGMP-то е публикуван и бъг в Socket Layer-a, който води пак до local crash на ядрото. Самите адвайсорита можете да видите на http://www.isec.pl/vulnerabilities/isec-0018-igmp.txt и http://www.isec.pl/vulnerabilities/isec-0019-scm.txt
успях да тествам и двете и работят. Очаква се отговор от kernel.org. Интерестно е защо не са се свързали първо с тях.
[Отговори на този коментар]
Към: Socket Layer
От: nobody
На: 15-12-2004@12:25 GMT+2
Оценка: 1/Неутраленза да може още някой като тебе да ги пусне за да се развихрят българските script kiddie-та
[Отговори на този коментар]
Към: Към: Socket Layer
От: euphoria
На: 15-12-2004@12:42 GMT+2
Оценка: 1/НеутраленБъговете са локални, за ремоте се искат бая условия. Това, че съм публикувал новината тука не виждам какъв е проблема? Те така или иначе са ПУБЛИЧНИ. Така поне българските линукс потребители знаят, че има такъв бъг. Не смятам, че бъгове трябва да се крият, то идеята е да се обявяват и фиксват. Не удобрявам, че ipsec са ги публикували преди да известят kernel разработчиците.
[Отговори на този коментар]
Към: Към: Към: Socket Layer
От: nobody
На: 15-12-2004@12:51 GMT+2
Оценка: 1/Неутраленидеята е че има експлойти преди да има фиксове което е доста неприятно
а за локални потребители не мислиш ли че се има прекалено много PHPBB-та за които има експлойти от адски много време ...
sad but true
[Отговори на този коментар]
Към: Към: Към: Към: Socket Layer
От: euphoria
На: 15-12-2004@13:42 GMT+2
Оценка: 1/НеутраленТака е последно време и аз това забелязвам. Дори и с phpBB положението беше същото. Дано не се превърне в практика.
"а за локални потребители не мислиш ли че се има прекалено много PHPBB-та за които има експлойти от адски много време ... "
Имаш предвид да се exec-не бъга през phpBB и така да забие машината ? Ако това си имал предвид тук проблема вече е в уебмастерите или хората, които поддържат форума. Бъгове и нови версии постоянно излизат няма такова нещо като абсолютно сигурен софтуерен продукт и това трябва да е ясно на всички.
[Отговори на този коментар]
Към: Към: Към: Към: Към: Socket Layer
От: Н. Антонов <nikola__at__linux-bg__dot__org>
На: 15-12-2004@13:48 GMT+2
Оценка: 1/НеутраленДобре, да приемем, че имам phpbb, което е уязвимо. Или нещо друго. Примерно някоя уебмейл система. Кажи ми как ще изпълниш чужд код на системата? Точно какво ще направиш? Евентуално би трябвало да копираш експлоита в директория, която да е позволена за писане и в същото време - позволена за изпълнение. Коя може да е тази директория?
[Отговори на този коментар]
Към: Към: Към: Към: Към: Към: Socket Layer
От: nobody
На: 15-12-2004@16:15 GMT+2
Оценка: 1/Неутраленako /tmp ne ti e na otdelen partition s noexec moutnatno ne vijdam problem
ako e taka napraveno stava po slojno no pak varianti bol - ako polzvash suexec scripta ti vurvi kato potrebitel i ti zapisvam exploita v direktoria kudeto imash pravo da pishesh obiknoveno home dir-a na prilojenieto ti
ako ne polzvash suexec a prilojenieto vurvi s usera na webservera stava malko po slojno tursi se direktoria s o+w permissions kakvito goliama 4ast ot prilojeniata polzvat za attachments uploads i tn
[Отговори на този коментар]
mi ...
От: bozhan <edmon__at__sex< dot >bg>
На: 15-12-2004@15:32 GMT+2
Оценка: 1/Неутраленпише ако и двете съществуват и и двете не са празни....:)
като едното е празно май не става?
[Отговори на този коментар]
Fix за igmp бъга
От: euphoria
На: 16-12-2004@12:20 GMT+2
Оценка: 1/НеутраленUbuntu май първи пуснаха patch. Ето част от пача, който оправя IGMP проблема.
+diff -urN x/net/ipv4/igmp.c y/net/ipv4/igmp.c
+--- x/net/ipv4/igmp.c 2004-08-24 17:19:34.000000000 +1000
++++ y/net/ipv4/igmp.c 2004-12-14 22:18:37.000000000 +1100
+@@ -1776,12 +1776,12 @@
+ goto done;
+ rv = !0;
+ for (i=0; i<psl->sl_count; i++) {
+- rv = memcmp(&psl->sl_addr, &mreqs->imr_multiaddr,
++ rv = memcmp(&psl->sl_addr[i], &mreqs->imr_sourceaddr,
+ sizeof(__u32));
+- if (rv >= 0)
++ if (rv == 0)
+ break;
+ }
+- if (!rv) /* source not found */
++ if (rv) /* source not found */
+ goto done;
+
+ /* update the interface filter */
+@@ -1823,9 +1823,9 @@
+ }
+ rv = 1; /* > 0 for insert logic below if sl_count is 0 */
+ for (i=0; i<psl->sl_count; i++) {
+- rv = memcmp(&psl->sl_addr, &mreqs->imr_multiaddr,
++ rv = memcmp(&psl->sl_addr[i], &mreqs->imr_sourceaddr,
+ sizeof(__u32));
+- if (rv >= 0)
++ if (rv == 0)
+ break;
+ }
+ if (rv == 0) /* address already there is an error */
+diff -urN x/net/ipv6/mcast.c y/net/ipv6/mcast.c
+--- x/net/ipv6/mcast.c 2004-08-24 17:19:05.000000000 +1000
++++ y/net/ipv6/mcast.c 2004-12-14 22:18:37.000000000 +1100
+@@ -389,12 +389,12 @@
+ goto done;
+ rv = !0;
+ for (i=0; i<psl->sl_count; i++) {
+- rv = memcmp(&psl->sl_addr, group,
++ rv = memcmp(&psl->sl_addr[i], source,
+ sizeof(struct in6_addr));
+- if (rv >= 0)
++ if (rv == 0)
+ break;
+ }
+- if (!rv) /* source not found */
++ if (rv) /* source not found */
+ goto done;
+
+ /* update the interface filter */
+@@ -435,8 +435,8 @@
+ }
+ rv = 1; /* > 0 for insert logic below if sl_count is 0 */
+ for (i=0; i<psl->sl_count; i++) {
+- rv = memcmp(&psl->sl_addr, group, sizeof(struct in6_addr));
+- if (rv >= 0)
++ rv = memcmp(&psl->sl_addr[i], source, sizeof(struct in6_addr));
++ if (rv == 0)
+ break;
+ }
+ if (rv == 0) /* address already there is an error */
[Отговори на този коментар]
Fix за socket бъга
От: euphoria
На: 16-12-2004@12:22 GMT+2
Оценка: 1/Неутрален+diff -urN x/include/linux/socket.h y/include/linux/socket.h
+--- x/include/linux/socket.h 2004-08-24 17:18:39.000000000 +1000
++++ y/include/linux/socket.h 2004-12-10 21:29:17.000000000 +1100
+@@ -90,6 +90,10 @@
+ (struct cmsghdr *)(ctl) : \
+ (struct cmsghdr *)NULL)
+ #define CMSG_FIRSTHDR(msg) __CMSG_FIRSTHDR((msg)->msg_control, (msg)->msg_controllen)
++#define CMSG_OK(mhdr, cmsg) ((cmsg)->cmsg_len >= sizeof(struct cmsghdr) && \
++ (cmsg)->cmsg_len <= (unsigned long) \
++ ((mhdr)->msg_controllen - \
++ ((char *)(cmsg) - (char *)(mhdr)->msg_control)))
+
+ /*
+ * This mess will go away with glibc
+diff -urN x/net/compat.c y/net/compat.c
+--- x/net/compat.c 2004-08-24 17:17:55.000000000 +1000
++++ y/net/compat.c 2004-12-10 21:24:13.000000000 +1100
+@@ -123,6 +123,12 @@
+ (struct compat_cmsghdr __user *)((msg)->msg_control) : \
+ (struct compat_cmsghdr __user *)NULL)
+
++#define CMSG_COMPAT_OK(ucmlen, ucmsg, mhdr) \
++ ((ucmlen) >= sizeof(struct cmsghdr) && \
++ (ucmlen) <= (unsigned long) \
++ ((mhdr)->msg_controllen - \
++ ((char *)(ucmsg) - (char *)(mhdr)->msg_control)))
++
+ static inline struct compat_cmsghdr __user *cmsg_compat_nxthdr(struct msghdr *msg,
+ struct compat_cmsghdr __user *cmsg, int cmsg_len)
+ {
+@@ -153,11 +159,7 @@
+ return -EFAULT;
+
+ /* Catch bogons. */
+- if(CMSG_COMPAT_ALIGN(ucmlen) <
+- CMSG_COMPAT_ALIGN(sizeof(struct compat_cmsghdr)))
+- return -EINVAL;
+- if((unsigned long)(((char __user *)ucmsg - (char __user *)kmsg->msg_control)
+- + ucmlen) > kmsg->msg_controllen)
++ if (!CMSG_COMPAT_OK(ucmlen, ucmsg, kmsg))
+ return -EINVAL;
+
+ tmp = ((ucmlen - CMSG_COMPAT_ALIGN(sizeof(*ucmsg))) +
+diff -urN x/net/core/scm.c y/net/core/scm.c
+--- x/net/core/scm.c 2004-08-24 17:16:55.000000000 +1000
++++ y/net/core/scm.c 2004-12-10 21:29:17.000000000 +1100
+@@ -127,9 +127,7 @@
+ for too short ancillary data object at all! Oops.
+ OK, let's add it...
+ */
+- if (cmsg->cmsg_len < sizeof(struct cmsghdr) ||
+- (unsigned long)(((char*)cmsg - (char*)msg->msg_control)
+- + cmsg->cmsg_len) > msg->msg_controllen)
++ if (!CMSG_OK(msg, cmsg))
+ goto error;
+
+ if (cmsg->cmsg_level != SOL_SOCKET)
+diff -urN x/net/ipv4/ip_sockglue.c y/net/ipv4/ip_sockglue.c
+--- x/net/ipv4/ip_sockglue.c 2004-08-24 17:16:28.000000000 +1000
++++ y/net/ipv4/ip_sockglue.c 2004-12-10 21:29:17.000000000 +1100
+@@ -146,11 +146,8 @@
+ struct cmsghdr *cmsg;
+
+ for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
+- if (cmsg->cmsg_len < sizeof(struct cmsghdr) ||
+- (unsigned long)(((char*)cmsg - (char*)msg->msg_control)
+- + cmsg->cmsg_len) > msg->msg_controllen) {
++ if (!CMSG_OK(msg, cmsg))
+ return -EINVAL;
+- }
+ if (cmsg->cmsg_level != SOL_IP)
+ continue;
+ switch (cmsg->cmsg_type) {
+diff -urN x/net/ipv6/datagram.c y/net/ipv6/datagram.c
+--- x/net/ipv6/datagram.c 2004-08-24 17:15:40.000000000 +1000
++++ y/net/ipv6/datagram.c 2004-12-10 21:29:17.000000000 +1100
+@@ -416,9 +416,7 @@
+ int addr_type;
+ struct net_device *dev = NULL;
+
+- if (cmsg->cmsg_len < sizeof(struct cmsghdr) ||
+- (unsigned long)(((char*)cmsg - (char*)msg->msg_control)
+- + cmsg->cmsg_len) > msg->msg_controllen) {
++ if (!CMSG_OK(msg, cmsg)) {
+ err = -EINVAL;
+ goto exit_f;
+ }
+diff -urN x/net/sctp/socket.c y/net/sctp/socket.c
+--- x/net/sctp/socket.c 2004-08-24 17:20:00.000000000 +1000
++++ y/net/sctp/socket.c 2004-12-10 21:29:17.000000000 +1100
+@@ -4052,12 +4052,8 @@
+ for (cmsg = CMSG_FIRSTHDR(msg);
+ cmsg != NULL;
+ cmsg = CMSG_NXTHDR((struct msghdr*)msg, cmsg)) {
+- /* Check for minimum length. The SCM code has this check. */
+- if (cmsg->cmsg_len < sizeof(struct cmsghdr) ||
+- (unsigned long)(((char*)cmsg - (char*)msg->msg_control)
+- + cmsg->cmsg_len) > msg->msg_controllen) {
++ if (!CMSG_OK(msg, cmsg))
+ return -EINVAL;
+- }
+
+ /* Should we parse this header or ignore? */
+ if (cmsg->cmsg_level != IPPROTO_SCTP)
[Отговори на този коментар]