安全安全再安全(3): 保护系统的安全感

偶不想说这所谓的”安全感”来自何处.

“是个保护系统就要占资源” :D

=====

mod_security: 基于规则的过滤. 功能强大, 规则很晕.
规则包更新较快.

phpids(PHP-Intrusion Detection System):
基于过滤规则的开源防护系统. 仔细看了下规则, 有点晕. :D
规则包更新速度极快. 个人还是相当推荐的, 虽然偶不需要.

suhosin(hardened-php):
安装复杂, 性能有 10% 左右下降, 保护的主要是程序和系统. 漏洞被发现之后, 能够减轻漏洞的影响.

=====

firewallscript 和 phpids 类似的商业软件, (主程序 php 37k, 有漂亮的管理程序, $120, 没有测试).
slashdot & techcrunch 有介绍.
号称 100% 保护. (DDOS, XSS, SQL injection, 内容提交可以通过 Akismet 过滤, 可以打开 Captcha… 倒是够全)
定期提供过滤规则包.

个人认为 firewallscript 和 mod_security 的防护水平是同一级别的(规则包说明一切, 虽然见不到).
如果考虑到那个管理程序的功能和扩展性(当然还有适用人群), firewallscript 大概对得起价钱.

=====

ps:
wordpress 有插件 Bad Behaviour. 具体原理就不说了. 规则固化在代码里, 随插件更新而更新.
实际上 bad behaviour 也能保护其它软件. 不过具体效果… 就不好说了 :D

ps2:
国内的空间商通常会装一种 “信息监控拦截系统”.
有一定的保护作用(特别是所谓的关键词), 经常误报, 也经常漏报. 国内的黑客们应该对它们很熟悉了.
用一点点普通的 sql 手法就可以跳过它们.
而且好像这些系统对 XSS 好像没什么效果.

标题中的 “安全感” 是什么意思? 就这个意思.

Tags: ,
Comments (1)

安全安全再安全(1): 乱, 大杂烩

写在前面: 地震已经发生了, 关注你需要关注的, 一直盯住一种或两种固定的媒体总会出问题.

mod_security:
(实话说 mod_security 令人恶心.)

SecFilterOutput On
SecFilterSelective OUTPUT "<?php" log,deny

注: 如果你正常想输出的话, HTML 代码中应该是 “&lt;?php” (偶是手写的, 应该没错?)


<ifmodule !mod_php.c>
<filesmatch ?.php$?>
Order allow,deny
Deny from all
Allow from none
</filesmatch>
</ifmodule>

DefaultType application/x-httpd-php

<?php include( 'a/path/outside/wwwroot/config.php'); ?>

=======

htpasswd generator:
(应该没人想过它是这么做的? 不相信某些网站的 htpasswd 生成器的同学看过来.
不过这样的东西, 显而易见的漏洞. 如果跑字典的话, 对一个密码需要生成 64^2 = 4096 个对应的加密值)

代码未经严格测试.

function htaccess_verify($pass1, $pass2) {
return (crypt($pass1,substr($pass2, 0, 2)) === $pass2);
}
function htaccess_gen($user, $pass, $salt='') {
$rand64= "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
srand((double)microtime()*1000000);
$random=rand();
if (!$salt) $salt=substr($rand64,$random % 64,1).substr($rand64,($random/64) % 64,1);
$salt = substr ($salt, 0, 2);
echo $user. ':' . crypt($pass, $salt);
}

=======
disabled_functions:
system,passthru,shell_exec,exec,proc_open,popen
virtual,getmyuid,getmypid,getenv,putenv,get_current_user –至少偶能看出来用没用 suexec 一类的东西
pcntl_exec,pcntl_fork — 推荐不编译.
ini_restore,ini_set,ini_get,ini_get_all,get_cfg_var –get_cfg_var,ini_get,ini_get_all 存疑, ini_alter= ini_set.
chmod,chown,chgrp — 存疑
leak
set_time_limit
php_uname,phpinfo
fsockopen,pfsockopen
highlight_file — show_source
ftp_connect,ftp_ssl_connect –ftp, sftp(if openssl available)
shmop_open –shmop
socket_create — socket
curl_init –curl 是安全隐患, 能够跳过 open_basedir, allow_url_fopen.

mail –偶从来不配这样的环境, 不过…
tmpfile — 受 open_basedir 影响, 偶不用 :D
extension_loaded, dl —-如果需要加载的话… :(
syslog,openlog –偶是不封的, 大量应用.

什么? 懒人? ok.

一般:
system,passthru,shell_exec,exec,proc_open,popen,virtual,getmyuid,getmypid,getenv,putenv,
get_current_user,pcntl_exec,pcntl_fork,ini_restore,ini_set,leak,fsockopen,pfsockopen,
highlight_file,ftp_connect,ftp_ssl_connect,shmop_open,socket_create

增强:
ini_get,ini_get_all,get_cfg_var,php_uname,phpinfo,curl_init,tmpfile,chmod,chown,chgrp,set_time_limit

另外几个存疑:
set_error_handler –自己写函数输出?
track_errors = 0 ?

(看的资料还太少, 估计这些也不够完整)
=======

allow_url_fopen = 0
display_errors = 0
error_log = “syslog” –这可是个大好的习惯.

=======

开发用的机器嘛, 统一 Apache(装偶挑选的性能/调试相关的 ext) , 使用一般的 disabled_functions.
docref_root 设置成内部镜像 or cn.php.net/cn2.php.net (这两个在偶这里都很快…)

=======

需要 disable eval 的环境, 使用 suhosin(hardened-php):
suhosin.executor.disable_eval

Tags: , ,
Comments (3)

Taint support for PHP

Taint, (污点检测).
防止未过滤的(文本)数据进入 HTML, SQL, Shell (命令/参数), 文件名等.

对 Perl 熟悉的同学应该知道, 从 Perl 5.8.0 起, perl 支持 taint mode.
-t enable tainting warnings
-T enable tainting checks

例如如下代码:

#!/usr/bin/perl

my $arg=shift; # 从命令行得到变量
sys-tem($arg); # 执行 :D (去掉那个横线, 否则? ...)

如果加上 -t:

Insecure $ENV{PATH} while running with -t switch at XXXX line Y.
Insecure dependency in system while running with -t switch at XXXX line Y.

需要特别注意:
透过正则表达式得到的变量能够通过这样的检查,
但是这样的检测不能分辨那些不能起到过滤作用的正则表达式.

===

2007.8.22, CORE GRASP, 一个需要打在 php-5.2.3 的 patch,
通过对字符串变量的逐字符标记, 给 php 增加了 taint mode (仅能保护 mysql_* 函数).
– 由于太过时, 而且功能不全, 所以就不给出具体地址了.

2008.4.23, 另一种 taint mode 的实现, php-5.2.5 patch, 来自 IBM.
(见 php wiki. http://wiki.php.net/rfc/taint)

在通过 php.ini 或脚本(ini_set) 开启 taint mode 后, 未过滤的字符串变量将会得到类似这样的提示:
Warning: echo(): Argument contains data that is not converted with htmlspecialchars() or htmlentities() in /path/to/script on line 3

常见的过滤方式:
HTML: htmlspecialchars(), htmlentities()
Shell: escapeshellcmd(), escapeshellarg()
Mysql: mysql_escape_string(), mysql_real_escape_string()
(数据库对应函数, addslashes 等)
正则表达式: preg_quote()

副作用: $_SERVER['SCRIPT_FILENAME'] 等安全的变量被误判, 可以用 untaint().
– untaint 操作要慎用 :D

===

taint 可以解决一些过滤问题(比如多数的 SQL 注入, 部分 XSS). 不过它当然不是万能的.
先有良好的安全意识, 再加上一些合适的工具做适当检测, 打造安全的运行环境并非不可能.

=== 正文结束 ===

ps:
Ruby 好像也有类似的支持.
python 有人写了类似的东西.

ps2:
开发用的机器上的环境, 都应该打大量的补丁, 性能, 安全, 一个都不能少.
– 你要一个列表? 抱歉, 暂时没整理出来. 想整理大概会比较困难.

ps3:
Firewall Script, 谁有钱, 谁去买… 估计应该会有用.

ps4:
接上篇文章,
对于这样的文章, 信息渠道是偶独有的, 如果通过正常的途径, 把这样的东西找出来, 应该是费时费力的.
非常不幸的是偶写这样的文章, 如果出现了什么问题, 大概也不会有什么人能够给偶纠错/更新,
这也是偶不喜欢写这类东西的原因.

内容时效性的提示, 仅仅是一个开始.

Tags: ,
Comments (2)

PHP 实践 Security Checklist

对照观看.
制作安全网站的 checklist

1 SQL
1.1 绑定可使用 PDO, 或者自己写的框架之类, 这个你随便 :D

Method #1:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

Method #2:

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);

Method #3:

$stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");
if ($stmt->execute(array($_GET['name']))) {

1.3 error_reporting() 设置为合适的级别.
1.4 mysql 方面设置过详细的权限对性能有一定影响, 还是自己好好写程序吧 :D
(这些权限的设置, 要对 mysql 数据库中,
user, db, host, tables_priv, columns_priv, procs_priv 表中的一个或多个进行查询)

2 命令行注入
(希望大家没人这么干 :D )

3 路径名问题
3.1 诸如 ../ 这样的都会过滤吧 :D
3.2 open_basedir, ***注意 curl 能够跳过这个限制***.
3.3 实际上这个也相当重要, 权限当然是越低越好了.
比如 uploadfiles/ 这类目录不应该给任何的执行权限.
apache 你知道怎么做吧? (以下代码未经测试.)

<Directory /uploadfiles>
php_flag engine off
</Directory>

如果还不过瘾, 可以使用 fstab 的限制方法.
限制都是有用的(4): Linux 的大洞不用补

4 会话管理
4.1 会话 ID 一般都和 uniqid() or md5() or sha1() 有关. — 这个相当笼统, 自己理解去吧…
一个相当好的会话 ID 样例: md5(uniqid(rand(), true));
4.2 URL 最容易被截取, 当然, 事实上 Cookies 和 URL 的截取, 难度是相近的.
4.5 秘密信息过期时间也成为了一个问题. 可以考虑生成时间戳相关的秘密消息.
例如 timestamp=xxx&hash=md5(timestamp . ’somesecret’. username)
– 其它方法你自己考虑去.

5 XSS
允许输入 HTML:
strip_tags (事实上应该去掉多数 attribute), 或使用相关的检测函数.

6 CSRF
6.1 问题同 4.5.

ps:
XSS & CSRF 通用方法: 找一个叫 caja 的东西去吧…
(偶没用过, 具体好不好用还要你说了算 :D )

ps2:
会日语的同学, 原版更好看.
安全なウェブサイトの作り方 改訂第3版

ps3:
应该都在关注 mysql uc 2008 吧, 偶偏不写, 偏不写 :D

Tags: ,
Comments (1)

限制都是有用的(4): Linux 的大洞不用补

什么? 你说(1) (2) (3) 都哪里去了? 都去讲 chroot 了…

Linux 从来就不安全… :D — 真矛盾啊…

Linux Kernel 2.6.17 – 2.6.24.1 vmsplice Local Root Exploit,
具有本地执行权限的黑客都是应该没问题的…
怎么办呢? 继续看… :D

1 Denyhosts
甚好, 能够和全世界的 SA 一起共享攻击数据… :D

2 chroot 环境
参见最上面列的 (1)(2)(3).

3 gentoo portage
(烘托气氛… 月黑风高无人访问的凌晨… 偶从 ssh 爬上来 :D )

(可以使用 screen.)
sudo glsa-check -f all

(不认识? GLSA = Gentoo Linux Security Advisories …)

然后更新 chroot 环境即可.

4 重头戏: /etc/fstab
以下为 mountpoint notes.
/ 好像不需要什么特别的措施 :D
/data *nodev,nosuid,noexec*, 存放各类数据.
/chroot *ro* (readonly), 存放程序
(含 php, lighty, mysql, …, 和应用, 需要更新就remount :D ,
注: 在 rw 的时候也不要给 lighttpd 用户留任何写权限.)

(你应该把 /data 和 /chroot/data 绑定起来.
如果懒的话直接挂应该也不会有什么危险)

——

这样的安全措施有什么样的效果?
设想最坏的情况 :D

php 冒洞了, 黑客取得了 lighttpd 的用户权限.
风险: 在 /data 上可以乱写/删有权限的文件.

他还能继续前进吗?
或许他可以上传一个 exploit, 发现 exploit 在 /data 中是不能执行的.
复制到 /chroot 那是不可能的, readonly :D

想破掉 readonly 需要如下步骤.
#1: 得到 chroot 内的 root.
这个… 上面说到, 没有执行自带程序的能力. 那么这个 root 是从哪里来的?
概率应该是太小了?

#2: mount proc
但是你只要不留这个目录, 就不会有风险.
更应该的是, chroot 除了必须的程序之外什么都不留.
mount 居然能够被留在里面…

(或许可以把 proc 挂到别的地方, 没有具体研究.
这里的风险就是核心参数, 所以还是相当危险的
废话, 拿到 root 能不危险 :D )

#3: remount(readwrite).

——

最后向大家推荐 shimmer.

shimmer is a pair of small programs (a client and a server) that provide an alternative to port knocking program such as tumbler and are used to hide a valuable port (such as a hidden web server or SSH) on a public IP address.

——

ps: 有条件的还是更新一下核心吧… 或许降级到 2.6.16 也是个不错的选择 :D

ps2: 你说 selinux? 这么麻烦, 偶懒 :D

Tags:
Comments

new 30 days(29): xss

30 days 内容部分的最后一篇.
day 30 将对整个系列进行总结.

Cross Site Scripting. 简称 XSS, 可是为什么不是 CSS(Cascading Style Sheets)? :D
Cross Site Scripting (XSS) questions and answers

预防为主… 事实上,仅仅禁用 Javascript 仍然是不够的.
Greg Murray’s Blog: Preventing Cross Site Scripting Attacks

最值得去看的地方了…
XSS (Cross Site Scripting) Cheat Sheet

倒霉的受害者… 不过, 个人认为最受关注的程序的漏洞最容易被发现…
XSSed – XSS (cross-site scripting) information and vulnerable websites archive

什么浏览器会出什么样的 XSS 问题?
Cross site scripting support

Tags: ,
Comments

new 30 days(28): security day 2 – system & network

网络和系统安全, 是一个无尽的话题.

在Windows下经常有插件,弹窗,恶意软件什么的东西.
(不过偶知道,能看见这篇文章的你,是不会遇上这类事情的…)

ARP 病毒也经常流行. dawnh 同学前端时间分析了 瑞星ARP防火墙

p2p 使宽带运营商的利益受损,
而通过限制一户多机,推送广告的方式赚取更多的利润.

不过如果小型局域网限制一下 p2p 偶还是不太反对的.
ipp2p 甚至能够一定程度控制 bitcomet (0.63 开始有协议加密)
Official IPP2P homepage

更为强大的过滤器, 如果你会抓包分析, 你可以写出详细的过滤条件.
Application Layer Packet Classifier for Linux

一份非常详细的Manual. 值得一看.
个人认为容易忽视的地方:
核心配置 – 关闭 modules.
文件系统权限
文件完整性检测
(freebsd mtree, gentoo equery check,
个人建议使用mtree对 chroot 目录, 及重要配置,可执行文件进行定期扫描.)
Securing Debian Manual

防治 ssh 攻击, 可以和官方站点共享攻击者数据, 防止其它机器被攻击.
对于经常攻击别人的黑客来说, 站点上还有状态展示, 可惜的是中国人有点多…
Welcome to DenyHosts

防止垃圾邮件. 早先讨论过相关问题.
The Spamhaus Project – SBL

iptables 不会怎么能行 :)
Iptables Tutorial 1.2.2

Tags: ,
Comments

new 30 days(27): security day 1 – php

数据过滤,过滤,再过滤,防止XSS 和 sql 注入,session也是个问题.
PHP Security Consortium: PHP Security Guide

检测php安全性的函数,类似phpinfo,提供安全的配置建议.
PHP Security Consortium: PHPSecInfo

不知道这个地方怎么行… 原来的hardening-php patch,现在的suhosin.
牺牲10%的性能,加倍的安全性能,你觉得值还是不值呢?
另外值得一提的就是 Month of PHP Bugs.
Hardened-PHP Project – PHP Security – Home

PHPSecInfo, PHP Security Guide的出处…
PHP Security Consortium

永远不要相信用户输入.
第6条, 可以考虑用file命令去检验一个文件,虽然很多时候不准.
第9条, 应该去使用socket去链接. 这样数据库的性能会进一步提高.
PHP MySQL Web Development Security Tips – 14 tips you should know about – PHP Forum

文章虽然没什么可说的, 底下的Further Reading可以看看.
Top 7 PHP Security Blunders

Tags: ,
Comments

限制都是有用的(3): lighttpd chroot

下面把lighttpd送进笼子里.

(准确说还是把php送进去)

主要大难点: mysql, extension(如果有装的话)

似曾相识:

mkdir /webroot/{var/run/lighttpd,var/run/cache ,var/log/lighttpd ,var/www/localhost/htdocs} -p
mkdir /webroot/{usr/lib64,bin,usr/bin,lib64,dev,etc,tmp} -p

非64位的同学把lib64改成lib即可

64bit only:
cd /webroot
ln -s lib64 lib
cd usr
ln -s lib64 lib
cd /webroot

Read the rest of this entry »

Tags: ,
Comments

限制都是有用的(2): openssh chroot – pam_chroot

上篇最重要的内容是建立一个chroot的环境.
后面类似的环境还要搭好几次.

环境的建立部分都在可爱的分割线(1,2)内.

在说今天的主角pam_chroot之前,先说一个神奇的更新.

[gentoo-x86] Log of /sys-libs/pam/ChangeLog:
Tue Jul 10 13:05:12 2007 UTC
Add a cracklib USE flag to enable/disable pam_cracklib module building.

cracklib确实是个大块头. :)
对于一般用户,还有偶这种一输密码就十多位字母符号数字这种的,
还有根本就不放权给别人的,cracklib的用处不大.

还有,Linux-PAM 0.99将pam_chroot从USE变量里面分离出来.

那么,根据sys-libs/pam的版本,安装方法不同.

0.78: USE="pam_chroot" emerge pam

0.99: emerge pam pam_chroot

然后,如果openssh编译的时候用上一篇的方法(USE=-pam)
那么需要去掉,然后重新来过 :(
Read the rest of this entry »

Tags:
Comments

Page 1 of 212