[CKAN-Security] cross-site scriping issue with email fields

Jörg-Thomas Vogt joerg-thomas.vogt at yourdata.de
Thu Feb 26 10:03:28 UTC 2015


Hello everybody,

I'm using CKAN 2.2.1 and evaluating CKAN 2.3.
A penetration test raised the following issue:

after specifying the following code e.g. in the author or maintainer 
email field for a resource

"><script>alert(document.cookie)</script>

this code will be executed after navigating to the resource (opening a 
popup with cookie informations).
Putting above code into the field for maintainer name or author name 
does not lead to
code execution.

I'm neither a CKAN expert nor a python developer but I suggest to check 
at least the email
fields for proper addresses.

I've added some code to ckan/logic/schema.py and 
ckan/logic/validators.py to perform some
basic checks. After these modifications it's not possible anymore to 
provide above script code
in an email field but I'm not sure whether the code will cover all 
possible  XSS attacks.

Kind regards

Thomas


=================== ckan/logic/schema.py ===========
*** schema_2.3.py       2015-02-26 09:56:39.741258600 +0100
--- schema_2.3_patched.py       2015-02-26 10:26:05.493253800 +0100
***************
*** 35,40 ****
--- 35,41 ----
                                      is_positive_integer,
                                      boolean_validator,
                                      user_about_validator,
+                                    email_validator,
vocabulary_name_validator,
vocabulary_id_not_changed,
                                      vocabulary_id_exists,
***************
*** 142,150 ****
           'name': [not_empty, unicode, name_validator, 
package_name_validator],
           'title': [if_empty_same_as("name"), unicode],
           'author': [ignore_missing, unicode],
!         'author_email': [ignore_missing, unicode],
           'maintainer': [ignore_missing, unicode],
!         'maintainer_email': [ignore_missing, unicode],
           'license_id': [ignore_missing, unicode],
           'notes': [ignore_missing, unicode],
           'url': [ignore_missing, unicode],#, URL(add_http=False)],
--- 143,151 ----
           'name': [not_empty, unicode, name_validator, 
package_name_validator],
           'title': [if_empty_same_as("name"), unicode],
           'author': [ignore_missing, unicode],
!         'author_email': [ignore_missing, email_validator, unicode],
           'maintainer': [ignore_missing, unicode],
!         'maintainer_email': [ignore_missing, email_validator, unicode],
           'license_id': [ignore_missing, unicode],
           'notes': [ignore_missing, unicode],
           'url': [ignore_missing, unicode],#, URL(add_http=False)],
***************
*** 428,434 ****
           'name': [not_empty, name_validator, user_name_validator, 
unicode],
           'fullname': [ignore_missing, unicode],
           'password': [user_password_validator, 
user_password_not_empty, ignore_missing, unicode],
!         'email': [not_empty, unicode],
           'about': [ignore_missing, user_about_validator, unicode],
           'created': [ignore],
           'openid': [ignore_missing],
--- 429,435 ----
           'name': [not_empty, name_validator, user_name_validator, 
unicode],
           'fullname': [ignore_missing, unicode],
           'password': [user_password_validator, 
user_password_not_empty, ignore_missing, unicode],
!         'email': [not_empty, email_validator, unicode],
           'about': [ignore_missing, user_about_validator, unicode],
           'created': [ignore],
           'openid': [ignore_missing],
***************
*** 473,479 ****

   def default_user_invite_schema():
       schema = {
!         'email': [not_empty, unicode],
           'group_id': [not_empty],
           'role': [not_empty],
       }
--- 474,480 ----

   def default_user_invite_schema():
       schema = {
!         'email': [not_empty, email_validator, unicode],
           'group_id': [not_empty],
           'role': [not_empty],
       }
=================== ckan/logic/schema.py ===========

=================== ckan/logic/validators.py ===========
*** validators_2.3.py   2015-02-26 09:57:09.279948100 +0100
--- validators_2.3_patched.py   2015-02-26 10:28:37.267934800 +0100
***************
*** 1,5 ****
--- 1,6 ----
   import collections
   import datetime
+ from email.utils import parseaddr
   from itertools import count
   import re
   import mimetypes
***************
*** 621,626 ****
--- 622,632 ----

       return value

+ def email_validator(value,context):
+     if value and not '@' in parseaddr(value)[1]:
+         raise Invalid(_('Invalid mail address.'))
+     return value
+
   def vocabulary_name_validator(name, context):
       model = context['model']
       session = context['session']
=================== ckan/logic/validators.py ===========

-- 
Joerg-Thomas Vogt

yourdata GmbH, Büchsenstr. 28, 70174 Stuttgart
Tel +49 711 490 448 24, Fax +49 711 490 448 36
joerg-thomas.vogt at yourdata.de, http://www.yourdata.de/
Geschäftsführer: Jörg Vogler, Dr. Markus Eberspächer
Sitz Stuttgart, AG Stuttgart, HRB 725115



More information about the Security mailing list