HARUYAMA Seigo
haruy****@queen*****
2005年 4月 5日 (火) 20:41:37 JST
春山です. 静的なソースコード監査ツール RATS - Rough Auditing Tool for Security http://www.securesoftware.com/resources/tools.html を用いてanthyのコードの一部をチェックしました. 今回は anthy-6331 の src-util ディレクトリ中のコードを対象としました. いくつかの問題のあるコードを発見しました. 1. dic-tool.c: read_entry() type_name[256] と宣言されていますが, sprintf()によって257バイト書きこまれる 可能性があります. #1. は田畑さんにIRCで報告しました 2. rkhelper.c: make_rkmap_shiftascii() opt->toggle が関数の外で書換えられるというあまりありえない 状況も考えたとすると, すべての c に対して rk_default_symbol[c] と c == opt->toggle が真となった場合 配列 work は [5*128] だけの領域を使います. 3. rkhelper.c: make_rkmap_hirakata() こちらも opt->toggle が関数の外で書換えられなければ問題ありませんが, work = alloca(2*128 + 6); ではなく work = alloca(2*128 + 8); のほうがよいでしょう. #2, 3 についてはそういう場合は保証しないというのもあり. これらをまとめたパッチを添付します. 他にも, dic-tool.c:find_head()などで, 配列の長さを関数に渡しておらずチェックされていない, dic-tool.c:print_usage()などで, フォーマット文字列にマクロをそのままないし連結していれている, などは潜在的に危険ではないかと思います. ----------ここから---------- --- orig/src-util/dic-tool.c +++ mod/src-util/dic-tool.c @@ -146,7 +146,7 @@ static int read_entry(FILE *fp) { - char buf[256], type_name[256]; + char buf[256], type_name[257]; char *res; struct trans_tab *t; do { --- orig/src-util/rkhelper.c +++ mod/src-util/rkhelper.c @@ -272,7 +272,7 @@ struct rk_rule* complete_rules; struct rk_map* map; struct rk_rule* p; - char work[2*128 + 3]; + char work[5*128]; char* w; int c; @@ -357,7 +357,7 @@ nr_rule = count_rk_rule_ent(opt, map_no); rk_var_part = alloca(sizeof(struct rk_rule) *(nr_rule + 2)); - work = alloca(2*128 + 6); + work = alloca(2*128 + 8); p = rk_var_part; w = work; ----------ここまで---------- -- 春山 征吾 / HARUYAMA Seigo haruy****@unixu***** haruy****@queen*****