In this course, we will explore the principles that make software secure and the recurring mistakes that make it vulnerable. We will look at where untrusted data enters a system, what happens when assumptions about state and concurrency break down, how cryptography is misused in practice, how access control fails, and how attacks increasingly target the supply chain and the build pipeline rather than the application itself. These principles are independent of any particular language or framework, and they will stay useful long after today's technologies have been replaced.
Considerable emphasis will be placed on hands-on work. We will write vulnerable code, exploit it, and fix it. We will also automate the detection of such issues so that a build pipeline catches them before they reach production. The programming language used in the exercises will be chosen to match the prior experience of the participants.
Course topics:
Lectures and slides are in English.