画像は本家から拝借。
このエントリはnginxアドベントカレンダーの3日目です。 なんかギリギリまで枠が空いたままで忍びないということもあり小ネタを共有。
最近は1ヶ月おきくらいに順調にマイナーverupが続いてましたね。 つい先日1.7.8もリリースされたことだしnginxのソースの歴史をふりかえってみようということで、メジャーバージョンアップごとのソースコード差分行数を見てみました。
結果
バージョン | 差分行数 |
---|---|
0.1.0〜0.2.0 | 51208 |
0.2.0〜0.3.0 | 3915 |
0.3.0〜0.4.0 | 43167 |
0.4.0〜0.5.0 | 10990 |
0.5.0〜0.6.0 | 13654 |
0.6.0〜0.7.0 | 29333 |
0.7.0〜0.8.0 | 38646 |
0.8.0〜0.9.0 | 23122 |
0.9.0〜1.0.0 | 1082 |
1.0.0〜1.1.0 | 3574 |
1.1.0〜1.2.0 | 20043 |
1.2.0〜1.3.0 | 1225 |
1.3.0〜1.4.0 | 18764 |
1.4.0〜1.5.0 | 53 |
1.5.0〜1.6.0 | 13435 |
1.6.0〜1.7.0 | 707 |
1.7.0〜1.7.8 | 9786 |
なお集計方法はざっくりこんな感じです。
hg diff -r release-0.1.0 -r release-0.2.0 | grep -c -E '^(\+|-)'
まとめ
1.4.0〜1.5.0の間に何があった・・・
追跡してみた
CVE-2013-2028の対応のようです。
diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -354,3 +354,4 @@
e04428778567dd4de329bbbe97ad653e22801612 release-1.3.14
cd84e467c72967b9f5fb4d96bfc708c93edeb634 release-1.3.15
23159600bdea695db8f9d2890aaf73424303e49c release-1.3.16
+7809529022b83157067e7d1e2fb65d57db5f4d99 release-1.4.0
diff --git a/auto/cc/clang b/auto/cc/clang
--- a/auto/cc/clang
+++ b/auto/cc/clang
@@ -5,8 +5,8 @@
# clang
-NGX_CLANG_VER=`$CC -v 2>&1 | grep 'clang version' 2>&1 \
- | sed -e 's/^.*clang version \(.*\)/\1/'`
+NGX_CLANG_VER=`$CC -v 2>&1 | grep '\(clang\|LLVM\) version' 2>&1 \
+ | sed -e 's/^.* version \(.*\)/\1/'`
echo " + clang version: $NGX_CLANG_VER"
diff --git a/auto/cc/name b/auto/cc/name
--- a/auto/cc/name
+++ b/auto/cc/name
@@ -67,7 +67,7 @@
NGX_CC_NAME=gcc
echo " + using GNU C compiler"
-elif `$CC -v 2>&1 | grep 'clang version' >/dev/null 2>&1`; then
+elif `$CC -v 2>&1 | grep '\(clang\|LLVM\) version' >/dev/null 2>&1`; then
NGX_CC_NAME=clang
echo " + using Clang C compiler"
diff --git a/docs/xml/nginx/changes.xml b/docs/xml/nginx/changes.xml
--- a/docs/xml/nginx/changes.xml
+++ b/docs/xml/nginx/changes.xml
@@ -5,6 +5,28 @@
+
+
+
+
+при обработке специально созданного запроса
+мог перезаписываться стек рабочего процесса,
+что могло приводить к выполнению произвольного кода (CVE-2013-2028);
+ошибка появилась в 1.3.9.
+Спасибо Greg MacManus, iSIGHT Partners Labs.
+
+
+a stack-based buffer overflow might occur in a worker process
+while handling a specially crafted request,
+potentially resulting in arbitrary code execution (CVE-2013-2028);
+the bug had appeared in 1.3.9.
+Thanks to Greg MacManus, iSIGHT Partners Labs.
+
+
+
+
+
+
diff --git a/src/core/nginx.h b/src/core/nginx.h
--- a/src/core/nginx.h
+++ b/src/core/nginx.h
@@ -9,8 +9,8 @@
#define _NGINX_H_INCLUDED_
-#define nginx_version 1004000
-#define NGINX_VERSION "1.4.0"
+#define nginx_version 1005000
+#define NGINX_VERSION "1.5.0"
#define NGINX_VER "nginx/" NGINX_VERSION
#define NGINX_VAR "NGINX"
diff --git a/src/http/modules/ngx_http_proxy_module.c b/src/http/modules/ngx_http_proxy_module.c
--- a/src/http/modules/ngx_http_proxy_module.c
+++ b/src/http/modules/ngx_http_proxy_module.c
@@ -2076,7 +2076,7 @@
v->no_cacheable = 0;
v->not_found = 0;
- v->data = ngx_pnalloc(r->connection->pool, NGX_OFF_T_LEN);
+ v->data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN);
if (v->data == NULL) {
return NGX_ERROR;
diff --git a/src/http/ngx_http_parse.c b/src/http/ngx_http_parse.c
--- a/src/http/ngx_http_parse.c
+++ b/src/http/ngx_http_parse.c
@@ -2209,6 +2209,10 @@
}
+ if (ctx->size < 0 || ctx->length < 0) {
+ goto invalid;
+ }
+
return rc;
done: