Ana (Sarah Polley), a nurse, finishes a long shift at her Milwaukee County hospital and returns to her peaceful suburban home. She and her waiting husband Louis (Justin Louis) make love and go to sleep, missing warnings beginning to trickle through the local media concerning a mysterious and rapidly-spreading contagion which turns its infected hosts into reanimated flesh-eating ghouls.
The next morning they are awoken by their zombified neighbor, a young girl, who bites Louis in the throat. Ana locks the zombie out of the room, but despite her frantic efforts, Louis dies. When Ana unsuccessfully attempts to call 911 for help, Louis immediately awakens as a reanimated zombie, and chases Ana into the bathroom. Ana escapes out the window and flees from her now chaos-torn neighborhood in her car, before a failed hijacking attempt sends her crashing into a tree. The opening credits roll, showing the worldwide collapse of human civilization.
Ana meets Kenneth (Ving Rhames), a grim police sergeant traveling to Fort Pastor, a nearby US Army base. With the route to the base blocked by zombies, they and three others - jack-of-all-trades Michael (Jake Weber), petty criminal Andre (Mekhi Phifer) and his pregnant Russian wife Luda (Inna Korobkina)- break into the nearby Crossroads Shopping Mall. Inside the mall, a scuffle with a zombified mall security guard results in Luda getting a minor bite-wound and Kenneth getting a cut on his arm.
They confront three living security guards - C.J. (Michael Kelly), Bart (Michael Barry) and Terry (Kevin Zegers) - and give up their weapons in exchange for refuge. After the group secures the mall, they head up to the mall's roof to dispose of bodies and paint SOS signs. There, they "meet" another survivor, Andy (Bruce Bohne), who is stranded alone in his gun store, across the mall's zombie-infested parking lot.
The next day, a delivery truck arrives at the mall, carrying the driver Norma (Jayne Eastwood), jerkish Steve (Ty Burrell), working man Tucker (Boyd Banks), elderly Glen (R.D. Reid), trampy Monica (Kim Poirier), bitten Frank (Matt Frewer) and his teen daughter Nicole (Lindy Booth), and an anonymous (and severely-injured) obese woman (Ermes Blarasin). These newcomers report that Fort Pastor has been overrun by zombies and no help is coming. Shortly after, the obese woman dies, reanimates and is killed by Ana, who thrusts a metal fireplace poker into her eye. The group determines that bites are how the zombies multiply their numbers; after Ana and Michael argue about what to do with the rapidly-deteriorating Frank, the man is isolated in a store with guard Kenneth, allowing him "every single second" before expiring. Michael and Ana achieve an awkward reconciliation, which is interrupted by Kenneth's shotgun blast as he destroys Frank's reanimated body.
Though the mall provides many material distractions and the survivors begin pairing off romantically (Ana and Michael, Terry and Nicole, Steve and Monica), the undead surround the refuge in ever-increasing numbers. Finally the malls power goes out and Michael, C.J., Bart and Kenneth enter the underground parking garage to turn on the emergency generator. They meet a friendly dog (Blue) who appears unharmed nor infected. They question this when a zombie suddenly bites Bart, which attracts more zombies that forces the group to flee. While trying to avoid the horde, Michael and Kenneth reach the generator compartment and C.J. joins them when Bart is overwhelmed and killed by the zombies. They eventually work together to douse the zombies with gasoline and set them ablaze.
Andre, faced with the fact that Luda will soon die, sinks totally into denial, and has his heavily-pregnant and infected wife tied to a bed in the mall's children's store. As she gives birth, she dies and reanimates. Norma checks on the couple, discovering the zombie-Luda and the demented Andre clutching a small bundle of blankets. Norma shoots Luda, causing Andre to snap completely; they exchange more gunfire and both are killed. Ana arrives on scene and opens the bundle to reveal a zombie baby. She pulls her revolver and a single shot rings through the mall.
At an impromptu memorial, Kenneth says anything is better than "sitting around waiting to die". The remaining mall-dwellers thus plot to fight their way to the local marina, and from there travel out on Steve's small yacht to an island in Lake Michigan. They reinforce two small shuttle buses from the parking garage, removing the seats, welding on a snowplow, attaching metal bars and floodlights, stringing barbed wire, boarding up the windows, and cutting slits for the deployment of weapons. Chainsaws, propane tanks and other supplies are also loaded on board. Meanwhile, Andy is starving, and will not have the strength to join the escape (and contribute much-needed ammunition), so the mall survivors strap a pack of food on "Chips", the dog from the basement, and lower him into the parking lot in a sling. Unfortunately, while Chips makes it safely to the gun-shop, a zombie sees the dog and gets in as well and bites Andy. Nicole, distraught over Chips, takes the delivery truck and barges her way into the gun store, where a now-zombified Andy traps her in a closet.
Kenneth, Michael, C.J., Terry, and Tucker gather their meager weapon supply and go into the sewers, while Steve is assigned guard-duty on their exit door. They reach the gun store, where they kill Andy, rescue Nicole and stock up on weapons and ammunition. A detonated propane tank is used to clear a path back to the sewers, but the zombies pursue them. Along the way, Tucker breaks his legs and, despite C.J.'s desperate attempts to pull him to safety, is attacked by the perusing zombies, forcing C.J. to shoot him dead out of mercy. Thanks to Steve's negligence, the zombies force open the exit door. The survivors pile into the buses and smash out into the parking lot, where another propane bomb is used to clear a path through the waiting horde. When Glen moves to take out a last hitchhiking zombie with a chainsaw, a sudden swerve sends the weapon slashing into Monica's shoulder. The resulting splatter of blood covers the windshield, causing driver Kenneth to lose control and crash. Glen and Monica are killed, while Steve flees the toppled bus and is attacked by the hitchhiking zombie.
The others scramble for the second bus, meeting zombie-Steve en route. Ana shoots him dead, then must linger long enough to get the boat keys off his corpse, allowing more zombies to catch up with them. Ana flees back to the bus, where Michael helps her in. After a short struggle, they pull away and speed to the marina dock, where they crash the bus and dash for the boat. Cornered in the bus by their pursuers, C.J. detonates a final propane tank blowing up the vehicle, the zombies, and himself. The remainder of the group gets on the boat, except for Michael; he was bitten while helping Ana. Ana futilely pleads with him to come, and the boat sets sail with Terry, Ana, Kenneth, Nicole, and Chips. Ana watches unflinchingly as Michael draws his pistol, places it under his chin, and a final gunshot rings out over the water.
The end-credits roll, interspersed with video footage taken by Terry, using a camera from the boat. Following a grim voyage where water, fuel and food supplies all run low, the remaining survivors succeed in reaching an island, only to be immediately attacked by a new swarm of zombies. As the survivors attempt to retreat to the boat, the camera falls to the ground and blacks out, leaving their ultimate fate unknown.