You are encouraged to work in groups (up to 3 people) for the labs and collaborate through version control (e.g., gitlab.cs). It is okay to use open-source code in your implementation. The labs are intended to be open-ended. Feel free to add interesting features.
For Lab 1, your job is to implement a web server using C/C++ on Linux. You may reuse code from 550’s project 1 if you have done that before. Then, enhance your web server with better security.
Part 1
For this part, implement a single-threaded event-driven web server.
The executable, 551ws
, takes one command-line argument,
the configuration filename.
You may design the configuration file format (see bonus part below).
The configuration file should allow an admin to specify an address
and a port number (IPv4/v6) on which the web server listens.
You may use getaddrinfo()
to convert the address and port number
in either IPv4 or IPv6 string form.
$ ./551ws ws.conf
The web server should be event-driven. In particular, it should use
epoll()
to manage file descriptors; it should use
non-blocking network I/O and blocking disk I/O.
For the HTTP protocol, we recommend you use the HTTP parser library, which is based on nginx’s code and used in Node.js.
One should be able to use a browser to retrieve a file via your web server,
such as http://127.0.0.1:10080/index.html
.
You may use either sendfile()
or other system calls to send HTTP responses.
Use the ApacheBench tool ab
to measure the performance of your server.
Part 2
The simple single-threaded architecture is not good for security—a single
bug may allow an attacker to take control of the server.
Your job in this part is to improve that with a better web server architecture.
Read the OKWS paper.
You may choose one design from Figure 2 of the paper,
or implement your own architecture.
In the file README
,
describe your design,
as well as what kind of vulnerabilities your design can and cannot prevent.
Implement your design and
use ab
to measure the performance of your new server.
Document the difference (if any) in README
,
along with your tests.
Bonus
Lua is a good embedded language
and has a simple C API (see Lua’s
and LuaJIT’s documentations).
Try to use Lua to simplify your web server and make it more reliable (hopefully,
with “less” C/C++ code).
One way to implement the configuration file
is to use a Lua script (see Apache’s
mod_lua).
In addition,
you may also implement the web server’s logic in Lua.
Use ab
to measure the performance impact if you choose to do so.
What to submit
Submit a tar file of the source code of your web server
and the README
file that contains your security analysis
and performance numbers from running ab
.
If you have done the bonus part, make a note in a file called
BONUS
.