Chicago avoided a three-game sweep and snapped the Blue Jays' three-game winning streak.
Alex Rios hit a two-run homer for the White Sox to tie it in the sixth inning and the contest remained deadlocked until Chicago came through in the ninth.
Francisco Cordero (1-3) came on for Toronto to try to get the game to extra innings, but he gave up a one-out single to Viciedo and then uncorked a wild pitch that allowed the runner to go to second.
Cordero got Alexei Ramirez on a long fly ball to center that moved Viciedo to third and Hudson came through with his clutch hit on a 1-1 pitch.
The win went to Addison Reed (1-1), who allowed a hit and struck out one while working the top of the ninth. It was Reed's first major league win in 29 major league relief appearances scattered over two seasons.