Skip to content

Commit 91e1712

Browse files
committed
Force all uses of random to use SystemRandom and abort if
pseudorandom random.Random would be used rather than Random.SystemRandom. random.Random is returning the same value time after time. Even when being seeded after instantiation, calls to the random.random() function return the same value like it's not advanceing the state of the generator. So "fix" is to force use of system random generator to generate: one time keys for password reset (action.py) random passwords when resetting passwords (password.py) serial number for auto ssl cert generation (roundup_server.py) Message-ID's in email: mailgw.py, client.py anti-csrf nonces (templating.py)
1 parent ab6de8b commit 91e1712

File tree

7 files changed

+66
-7
lines changed

7 files changed

+66
-7
lines changed

roundup/cgi/actions.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
1-
import re, cgi, time, random, csv, codecs
1+
import re, cgi, time, csv, codecs
22
from io import BytesIO
33

4+
try:
5+
# Use the cryptographic source of randomness if available
6+
from random import SystemRandom
7+
random=SystemRandom()
8+
except ImportError:
9+
raise
10+
from random import Random
11+
random=Random()
12+
413
from roundup import hyperdb, token, date, password
514
from roundup.actions import Action as BaseAction
615
from roundup.i18n import _

roundup/cgi/client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
random=SystemRandom()
1818
logger.debug("Importing good random generator")
1919
except ImportError:
20-
from random import random
20+
raise
21+
from random import Random
22+
random=Random()
2123
logger.warning("**SystemRandom not available. Using poor random generator")
2224

2325
try:

roundup/cgi/templating.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@
3636
from random import SystemRandom
3737
random=SystemRandom()
3838
except ImportError:
39-
from random import random
39+
raise
40+
from random import Random
41+
random=Random()
42+
4043
try:
4144
import cPickle as pickle
4245
except ImportError:

roundup/mailgw.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,19 @@ class node. Any parts of other types are each stored in separate files
9595
__docformat__ = 'restructuredtext'
9696

9797
import string, re, os, mimetools, cStringIO, smtplib, socket, binascii, quopri
98-
import time, random, sys, logging
98+
import time, sys, logging
9999
import traceback
100100
import email.utils
101101

102+
try:
103+
# Use the cryptographic source of randomness if available
104+
from random import SystemRandom
105+
random=SystemRandom()
106+
except ImportError:
107+
raise
108+
from random import Random
109+
random=Random()
110+
102111
from anypy.email_ import decode_header
103112

104113
from roundup import configuration, hyperdb, date, password, exceptions

roundup/password.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,20 @@
1919
"""
2020
__docformat__ = 'restructuredtext'
2121

22-
import re, string, random
22+
import re, string
2323
import os
2424
from base64 import b64encode, b64decode
2525
from hashlib import md5, sha1
2626

27+
try:
28+
# Use the cryptographic source of randomness if available
29+
from random import SystemRandom
30+
random=SystemRandom()
31+
except ImportError:
32+
raise
33+
from random import Random
34+
random=Random()
35+
2736
try:
2837
import crypt
2938
except ImportError:
@@ -363,6 +372,13 @@ def test():
363372
assert 'sekrit' == p
364373
assert 'not sekrit' != p
365374

375+
376+
print random.randrange(36, 52)
377+
# this seems to return the save password every time
378+
# when run inside a roundup daemon.
379+
# but it tests out ok. I don't know why. -- rouilj
380+
print generatePassword()
381+
366382
if __name__ == '__main__':
367383
test()
368384

roundup/roundupdb.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,17 @@
2020
"""
2121
__docformat__ = 'restructuredtext'
2222

23-
import re, os, smtplib, socket, time, random
23+
import re, os, smtplib, socket, time
24+
25+
try:
26+
# Use the cryptographic source of randomness if available
27+
from random import SystemRandom
28+
random=SystemRandom()
29+
except ImportError:
30+
raise
31+
from random import Random
32+
random=Random()
33+
2434
import cStringIO, base64, mimetypes
2535
import os.path
2636
import logging

roundup/scripts/roundup_server.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,17 @@
8888

8989
def auto_ssl():
9090
print _('WARNING: generating temporary SSL certificate')
91-
import OpenSSL, random
91+
import OpenSSL
92+
93+
try:
94+
# Use the cryptographic source of randomness if available
95+
from random import SystemRandom
96+
random=SystemRandom()
97+
except ImportError:
98+
raise
99+
from random import Random
100+
random=Random()
101+
92102
pkey = OpenSSL.crypto.PKey()
93103
pkey.generate_key(OpenSSL.crypto.TYPE_RSA, 768)
94104
cert = OpenSSL.crypto.X509()

0 commit comments

Comments
 (0)