Jon Garland, who has struggled with consistency in July, allowed three runs and 10 hits in 7 1-3 innings. He struck out two and walked one.
Garland (8-7) got out of the seventh with runners on first and third by getting Troy Glaus to pop out. He then gave up a one-out double to Vernon Wells in the eighth before reliever Ehren Wassermann got two outs to end the inning.
Bobby Jenks pitched a perfect ninth for his 29th save in 34 chances.
Toronto starter Josh Towers hit A.J. Pierzynski with one out in the sixth, and Josh Fields followed with a single to chase Towers. Reliever Brian Tallet got Scott Podsednik to ground out, but Uribe followed with a double down the left field line to give the White Sox a 4-3 lead.
Reed Johnson matched a career-high with four hits for the Blue Jays, who snapped a season-high five game winning streak.
Frank Thomas, who hit 448 home runs with the White Sox in 16 seasons, made his first appearance in Chicago since hitting his 500th home run last month. He received a standing ovation before his first at-bat in the second inning.
Toronto trailed 1-0 in the fourth but rallied to take a 3-1 lead.
Thomas hit a two-out fly ball to the left field warning track that Podsednik misjudged. After starting to climb the wall, Podsednik jumped off but was unable to make the catch. Alex Rios, who had singled, came around from first to score and Thomas went to second with a double. Aaron Hill followed with a single to left, and Thomas slid into home, barely beating the relay. Hill took second on the throw and scored on Matt Stairs' single.