Hello Professor Stein. For a final project at Case Western, I offered to setup a cluster of SAGE servers for the math department. Unfortunately, I found that the default server setup is highly insecure. I would like to collaborate with you and find a way to modify the notebook deployment to eliminate some basic (yet severe) security issues.
Since I'm new to SAGE (and Python, for that matter), I decided that the easiest way to determine how to safely deploy a server would be to login to a public SAGE server and reverse-engineer its deployment based on my queries. Coincidentally, I stumbled upon your server (don't worry -- I did not execute any malicious commands.) and discovered several risks. Using the os module in Python, you can find the following: 1. All of the processes running on the server, as well as the parameters used to execute them. 2. The username, uid, groups, gid, etc of the current process. 3. The permissions of large portions of the file system. 4. The operating system the server is deployed on. 5. All of the users on the system. 6. The programs available to the users 7. Services running on the computer 8. Devices attached to the computer (I'm guessing this is a virtualized server, though...) These are just the things I can think of off the top of my head. This is more than enough information for a hacker to bring down the server. Here are just a few potential attacks I can think of: 1. scp appears to be among the available programs in what I'm guessing was an instance of the virtualized server image. Even if gcc was not available on the server side (it appears that it is), anyone could compile an executable on their own system and transfer it to the server via scp. 2. Delete any file owned by the server uid. Based on something I read on your forum, it appears that you used to be able to delete the SAGE server itself (this was the first exploit I checked for). 3. Kill processes owned by the server uid. This means you could: - Kill the server - Create a python script that ruins system resources by (1) creating random processes, and (2) killing these with signal 9. Signal 9 does not properly return resources to the OS, so looping this for a few minutes will just eat the system. 4. By combining (2) and (3), you can actually bring down the server in such a way that it will delete all of the user accounts (I tested this on my own server). Just do the following: import os; os.system("rm -Rf ~/.sage/*"); # Destroy the contents of my .sage folder os.system("rm -Rf ....../sage_notebook/*") # Destroy the cached notebook information os.system("ps -A | grep python"); # Returns a list of python processes. Based # upon the information found in twistd.d, you # can easily guess which instance is hosting # your server ( It's the pid just before the one # given by twistd.pd ) os.system("kill -9 XXX") # Where XXX is the pid of the aforementioned python # interpreter. kill -9 ensures that no cleanup occurs # and the notebook is not saved back to disk. Hence, I can eliminate all user accounts and bring down the server. When the server is brought back up, all of the user account information will be gone. Given the current design, I believe this exploit is unavoidable (the server must have write permissions to those folders; hence, it can delete the files). Obviously, the biggest problem here is that the user has full access to a system terminal. A simple solution could be to re-bind the os.system function to None when the notebook is launched. Since I haven't dug deeply enough into the notebook code yet, I don't know if this is actually feasible (the notebook might use the os.system command. Furthermore, since I'm new to Python, there might be a way to unload and reload the module that I don't know about. This would eliminate the effect of the re-binding). Assuming that the re-binding trick works, we'd probably want to use the same trick to black-list other commands as well. Another alternative would be to allow the underlying operating system to have more control over the SAGE user accounts. Although SAGE allows individuals to login on the front page, all "users" are actually just the server user on the backend. In other words, this is really just an application-level user management scheme. In order to eliminate the 4th exploit I described, you would need to map these to system users. This would imply that: - The file deletions given above would only delete that user's files - The user would not have permission to bring down the server with a kill -9 You would still need to be careful about how you set file and executable access for these individual users, but as you can see this alternative already makes the server quite a bit safer. The only remaining exploit that I can think of is due to the power of the Python language. Potentially, even if you got rid of programs such as scp (for file transfer, if you recall), someone could write a simple file-transfer program using Python and sockets. Once again, a black-list might be able to address this issue, but another solution is probably necessary. Anyway, I've been typing this message long enough. I hope to hear from you soon about your thoughts on these issues. -- TrixB4Kidz P.S. You have a few hundred defunct sage processes running on your system. --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-devel@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/ -~----------~----~----~----~------~----~------~--~---