6.858 Fall 2011 Lab 7: Final project
| Wiki submission due: | Friday, November 4, 2011 | 
| Proposals due: | Monday, November 14, 2011 | 
| Presentations due: | Monday, December 12, 2011 (in class) | 
| Code and write-up due: | Friday, December 16, 2011 (11:59pm) | 
Introduction
In this lab, you will work on a final project of your own choice.  Unlike
in previous labs, you may work in groups of 3 for the final project.
You will be required to turn in both your code and a short write-up
describing the design and implementation of your project, and to make
a short in-class presentation about your work.
Below are some ideas for final projects that you might use as inspiration,
including some of the projects from past years.
We encourage you to come up with your own ideas for what you would like to
work on; don't restrict yourself to this list.
    - Examine the security of Android applications.  Look at some previous
        studies for inspiration
        (one,
         two).
    
- Improve sandboxing for Android applications.  Is there something that
        you could do to prevent a malicious application from exploiting kernel
        bugs?  Consider
        recent improvements to seccomp or using
        Linux KVM.
    
- Audit interactions between Android applications, perhaps by tracing
        all intents sent via the reference monitor.  When something goes wrong,
        can your system tell the user why an application might be broken?
    
- Implement an environmental
        key generation system.
    
- Build a password manager for Android applications, perhaps by implementing
        a virtual keyboard that can automatically enter passwords into an application.
        The virtual keyboard can know exactly what application it's entering passwords
        into, which can guard against phishing-style attacks.
    
- Provide more fine-grained network access control in Android, to protect an
        internal corporate network from possibly-malicious applications on a phone.
    
- Allow users to control application permissions in Android.  For example,
        a user may want to install some application that requires access to the
        current GPS location, but the user doesn't actually want to give the app
        this permission.  Would it suffice to simply remove the permission from
        the manifest, or is it necessary to provide dummy services that give back
        fake data?
    
- Implement more efficient sandboxing support for Python, so that it's
        possible to import an untrusted Python module without giving it full
        access to your system or your application, and without having to run
        the entire application in a separate PyPy sandbox.
	Python already provides some basic memory safety guarantees (although
        you might need to implement some mechanism to restrict introspection).
    
- Speed up PyPy's sandbox mode.
    
- Implement a more fully-featured PyPy sandbox.  Can you run all of zoobar
        in the sandbox, to avoid any need for uid-based privilege isolation?
    
- Use DynamoRIO's binary instrumentation to implement some cool security
	mechanism for unmodified binaries.  For example, you could implement a
	binary-level taint tracking system, similar to
	Resin, that prevents
	secret files from being sent out over the network.
        You can look at a previous lab we used to have involving DynamoRIO last year
        here.
    
- Use Resin's taint tracking
        for Python to enforce some interesting properties in zoobar.
    
- Find an interesting use for trusted hardware, and figure
	out how to expose trusted hardware safely to applications.
	Linux should already have a basic device driver for a TPM.
    
- Extend Native
	Client to support a richer set of external I/O operations,
        such as safe network I/O, local files, etc.
    
- Build tools to find common vulnerabilities in programs of your choice
	(e.g., C code, PHP, Python, etc).  There are several existing frameworks
	on which you could start building, such as
	sparse
	and LLVM for C code, or
	PQL (the tool from the Java
	static analysis paper) for Java.
    
- Write a tool to help privilege-separating Python applications.
    
- Evaluate how hard it is to privilege-separate a real application
        (pick any application and try to privilege-separate it yourself;
        there should be many examples of Django-based Python apps).
    
- Implement more flexible protection mechanisms for Linux (so that any
	user can create additional protection domains -- sub-users -- to run
	code with less privileges, without having to be root).  You can build
	upon a class project from a previous year,
	UserFS.
    
- Based on Google's caja
	library, sandbox existing Javascript mashups/applets (what to do
	about existing uses of globals in the Javascript environment?)
    
- Write a browser plugin to prevent cross-site scripting attacks when
	both the server and the client are following some rules (e.g.
	explicitly annotating privileged JS code).  Bonus points for
	allowing untrusted JS code using something like caja!
    
- Improve the security of HTTPS in web browsers in the face of possibly
        compromised CAs.  For example, define a new URL syntax that includes
        the server's certificate public key in the URL itself, so that one site
        can unambiguously include a link to another site without relying on CAs.
        Or, include the CA name in the URL, so that another CA cannot subvert
        security.  See
        SSL observatory,
        perspectives, and
        CertPatrol.
    
- Implement an encrypted file system with plausible deniability (i.e.
	where there can be multiple encrypted file system images within a
	single FS, and without the right password, you don't know if unused
	blocks are free or part of another encrypted FS you don't have the
	password for.)  See paper on
	deniable file systems and
	TrueCrypt.
    
- Auditing support for web applications.
	For instance, suppose someone broke into your blog or forum, added a user
	account for themselves, changed permissions, and posted garbage messages.
	How can you track down all of the changes made by the attacker?
	Could be done with the help of a language runtime, such as Resin.
    
- Explore the extent to which covert channels / side channels matter,
	e.g. in shared VMs like EC2, vs. shared OS, vs. other environments.
	See this paper for
	some background information.
    
- Examine the security of Google's Chromebook
        laptops.  We can loan out some
        CR-48 laptops
        to interested students.
    
- Integrate zoobar with single-signon protocols like Microsoft Passport,
        OpenID, OAuth, etc.
    
- Figure out how to integrate password-authenticated key exchange
        protocols into a web browser.  Note that such protocols could be
        used to both authenticate the user to the server (thus avoiding
        phishing attacks), and to authenticate the server to the user
        (thus avoiding compromised CA attacks).  For references, look up
        SRP and PAKE.
We encourage final projects that combine some ideas you have learned in
6.858 with other classes or projects you are already working on.  For
example, implementing some aspects of a capability design from KeyKOS
in the JOS kernel from 6.828 might make a good final project that you
could use in both classes.  Extending some system you are already working
on to add better security mechanisms would also be a good candidate project.
Several final projects from last year's class ended up being subsequently
published as research papers
(e.g.,
UserFS,
BStore,
and
LXFI).
If this sounds interesting to you, try to pick an ambitious class project
that you might want to continue working on afterwards!
There are four concrete steps to the final project, as follows:
Decide on the project you would like to work on, and post a one-to-two-sentence
summary of your idea to the
project ideas wiki page.
Use the same list of project ideas to help you find other students interested
in similar projects, for forming a group.
 
Discuss your proposed idea with course staff over the next week,
before the proposal deadline, to flesh out the exact problem you
will be addressing, how you will go about doing it, and what tools
you might need in the process.  By the proposal deadline, you must
submit a one-to-two-page proposal describing: your group members
list, the problem you want to address, how you plan to address it,
and what are you proposing to specifically design and implement.
Submit your proposal via email to the course staff
(6.858-staff@pdos.csail.mit.edu).
 
Prepare a short in-class presentation about the work that you have done
for your final project.  We will provide a projector that you can use
to demonstrate your project.
 
Write a document describing the design and implementation of your project,
and turn it in along with your project's code by the final deadline.