As systems grow in size and complexity, our ability to protect them through manual intervention or static defenses degrades. We believe that, in addition to proper design principles and proactive mechanisms, automated reactive approaches must be employed to close the gap in the attacker vs. defender capabilities. Toward this goal, we have been examining the possibility of software systems that self-diagnose and repair themselves in the presence of previously unknown attacks and failures, with minimal or no human intervention. In this talk, I will discuss our research in self-healing software systems. I will introduce the concepts of "micro-speculation" and "error virtualization", which can be combined to provide a generic mechanism for dealing with low-level software failures and vulnerabilities. I will describe the use of these techniques in two system prototypes of self-healing software that address such vulnerabilities: the Worm Vaccine architecture and STEM (Selective Transactional EMulation). I will close the talk with a discussion of our preliminary work toward software Application Communities, groups of identical instances of an application that cooperate to improve their collective security.