[Anthy-dev 2000] RATSを用いたanthyのソースコード監査 [src-util編]

Back to archive index

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*****



Anthy-dev メーリングリストの案内
Back to archive index