]> git.donarmstrong.com Git - roundcube.git/blob - debian/patches/xss-fix.patch
Add patch to fix XSS vulnerability (CVE-2007-6321)
[roundcube.git] / debian / patches / xss-fix.patch
1 --- roundcube/program/steps/mail/func.inc       (revision 943)
2 +++ roundcube/program/steps/mail/func.inc       (working copy)
3 @@ -477,6 +477,85 @@
4    }
5  
6  
7 +function rcmail_html_filter($html)
8 +  {
9 +  preg_match_all('/<\/?\w+((\s+\w+(\s*=\s*(?:".*?"|\'.*?\'|[^\'">\s]+))?)+\s*|\s*)\/?>/', $html, $tags);
10 +
11 +  /* From Squirrelmail: Translate all dangerous Unicode or Shift_JIS characters which are accepted by
12 +   * IE as regular characters. */
13 +  $replace = array(array('&#x029F;', '&#0671;' ,/* L UNICODE IPA Extension */
14 +                         '&#x0280;', '&#0640;' ,/* R UNICODE IPA Extension */
15 +                         '&#x0274;', '&#0628;' ,/* N UNICODE IPA Extension */
16 +                         '&#xFF25;', '&#65317;' ,/* Unicode FULLWIDTH LATIN CAPITAL LETTER E */
17 +                         '&#xFF45;', '&#65349;' ,/* Unicode FULLWIDTH LATIN SMALL LETTER E */
18 +                         '&#xFF38;', '&#65336;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER X */
19 +                         '&#xFF58;', '&#65368;',/* Unicode FULLWIDTH LATIN SMALL LETTER X */
20 +                         '&#xFF30;', '&#65328;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER P */
21 +                         '&#xFF50;', '&#65360;',/* Unicode FULLWIDTH LATIN SMALL LETTER P */
22 +                         '&#xFF32;', '&#65330;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER R */
23 +                         '&#xFF52;', '&#65362;',/* Unicode FULLWIDTH LATIN SMALL LETTER R */
24 +                         '&#xFF33;', '&#65331;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER S */
25 +                         '&#xFF53;', '&#65363;',/* Unicode FULLWIDTH LATIN SMALL LETTER S */
26 +                         '&#xFF29;', '&#65321;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER I */
27 +                         '&#xFF49;', '&#65353;',/* Unicode FULLWIDTH LATIN SMALL LETTER I */
28 +                         '&#xFF2F;', '&#65327;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER O */
29 +                         '&#xFF4F;', '&#65359;',/* Unicode FULLWIDTH LATIN SMALL LETTER O */
30 +                         '&#xFF2E;', '&#65326;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER N */
31 +                         '&#xFF4E;', '&#65358;',/* Unicode FULLWIDTH LATIN SMALL LETTER N */
32 +                         '&#xFF2C;', '&#65324;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER L */
33 +                         '&#xFF4C;', '&#65356;',/* Unicode FULLWIDTH LATIN SMALL LETTER L */
34 +                         '&#xFF35;', '&#65333;',/* Unicode FULLWIDTH LATIN CAPITAL LETTER U */
35 +                         '&#xFF55;', '&#65365;',/* Unicode FULLWIDTH LATIN SMALL LETTER U */
36 +                         '&#x207F;', '&#8319;' ,/* Unicode SUPERSCRIPT LATIN SMALL LETTER N */
37 +                         "\xEF\xBC\xA5", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER E */
38 +                                         /* in unicode this is some Chinese char range */
39 +                         "\xEF\xBD\x85", /* Shift JIS FULLWIDTH LATIN SMALL LETTER E */
40 +                         "\xEF\xBC\xB8", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER X */
41 +                         "\xEF\xBD\x98", /* Shift JIS FULLWIDTH LATIN SMALL LETTER X */
42 +                         "\xEF\xBC\xB0", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER P */
43 +                         "\xEF\xBD\x90", /* Shift JIS FULLWIDTH LATIN SMALL LETTER P */
44 +                         "\xEF\xBC\xB2", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER R */
45 +                         "\xEF\xBD\x92", /* Shift JIS FULLWIDTH LATIN SMALL LETTER R */
46 +                         "\xEF\xBC\xB3", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER S */
47 +                         "\xEF\xBD\x93", /* Shift JIS FULLWIDTH LATIN SMALL LETTER S */
48 +                         "\xEF\xBC\xA9", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER I */
49 +                         "\xEF\xBD\x89", /* Shift JIS FULLWIDTH LATIN SMALL LETTER I */
50 +                         "\xEF\xBC\xAF", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER O */
51 +                         "\xEF\xBD\x8F", /* Shift JIS FULLWIDTH LATIN SMALL LETTER O */
52 +                         "\xEF\xBC\xAE", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER N */
53 +                         "\xEF\xBD\x8E", /* Shift JIS FULLWIDTH LATIN SMALL LETTER N */
54 +                         "\xEF\xBC\xAC", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER L */
55 +                         "\xEF\xBD\x8C", /* Shift JIS FULLWIDTH LATIN SMALL LETTER L */
56 +                         "\xEF\xBC\xB5", /* Shift JIS FULLWIDTH LATIN CAPITAL LETTER U */
57 +                         "\xEF\xBD\x95", /* Shift JIS FULLWIDTH LATIN SMALL LETTER U */
58 +                         "\xE2\x81\xBF", /* Shift JIS FULLWIDTH SUPERSCRIPT N */
59 +                         "\xCA\x9F", /* L UNICODE IPA Extension */
60 +                         "\xCA\x80", /* R UNICODE IPA Extension */
61 +                         "\xC9\xB4"),  /* N UNICODE IPA Extension */
62 +                   array('l', 'l', 'r', 'r', 'n', 'n', 'E', 'E', 'e', 'e', 'X', 'X', 'x', 'x',
63 +                         'P', 'P', 'p', 'p', 'R', 'R', 'r', 'r', 'S', 'S', 's', 's', 'I', 'I',
64 +                         'i', 'i', 'O', 'O', 'o', 'o', 'N', 'N', 'n', 'n', 'L', 'L', 'l', 'l',
65 +                         'U', 'U', 'u', 'u', 'n', 'n', 'E', 'e', 'X', 'x', 'P', 'p', 'R', 'r',
66 +                         'S', 's', 'I', 'i', 'O', 'o', 'N', 'n', 'L', 'l', 'U', 'u', 'n', 'l', 'r', 'n'));
67 +  if ((count($tags)>3) && (count($tags[3])>0))
68 +    foreach ($tags[3] as $nr=>$value)
69 +    {
70 +    /* Remove comments */
71 +    $newvalue = preg_replace('/(\/\*.*\*\/)/','$2',$value);
72 +    /* Translate dangerous characters */
73 +    $newvalue = str_replace($replace[0], $replace[1], $newvalue);
74 +    /* Rename dangerous CSS */
75 +       $newvalue = preg_replace('/expression/i', 'expresion', $newvalue);
76 +       $newvalue = preg_replace('/url/i', 'urrl', $newvalue);
77 +       $newattrs = preg_replace('/'.preg_quote($value, '/').'$/', $newvalue, $tags[1][$nr]);
78 +       $newtag = preg_replace('/'.preg_quote($tags[1][$nr], '/').'/', $newattrs, $tags[0][$nr]);
79 +    $html = preg_replace('/'.preg_quote($tags[0][$nr], '/').'/', $newtag, $html);
80 +    }
81 +
82 +  return $html;
83 +  }
84 +
85 +
86  function rcmail_print_body($part, $safe=FALSE, $plain=FALSE)
87    {
88    global $IMAP, $REMOTE_OBJECTS;
89 @@ -528,7 +607,7 @@
90        $body = preg_replace($remote_patterns, $remote_replaces, $body);
91        }
92  
93 -    return Q($body, 'show', FALSE);
94 +    return Q(rcmail_html_filter($body), 'show', FALSE);
95      }
96  
97    // text/enriched