Colon was sailing heading into the ninth, striking out eight and allowing just two runs, and going for his sixth complete game of the season.
That is when he was met with a Ray Durham leadoff single, setting up the homer by Bonds, who struck out in each of his first three at bats.
Colon then gave up a single to Benito Santiago, and after Jose Cruz's fielder's choice bunt, a single to Pedro Feliz. After balking, putting the runners in scoring position, Colon intentionally walked Edgardo Alfonzo to load the bases with one out.
Damaso Marte then came in and gave up the grand slam to pinch-hitter Rich Aurilia. Colon ended up allowing seven runs in 8 1/3 innings.
The Sox scored their four runs on Frank Thomas' two-run homer in the first and a Joe Crede bases-loaded two-run single in the third.
Crede went 3-4 in the game, while Tony Graffanino went 2-4. Aaron Rowand, making his first start since being recalled on Tuesday, went 1-4.
The Sox will now face the visiting Padres in a three-game set starting Friday at 7:05 p.m. CT, with Esteban Loaiza going up against Kevin Jarvis.
The game will be televised on Fox Sports Net Chicago Plus.