The Indians inched within two games of first-place Detroit in the American League Central, the Tigers having lost Wednesday to Minnesota.
Carmona (6-12) walked three and struck out six in 8 1/3 innings. After walking Carlos Quentin with one away in the ninth, Carmona was relieved by Chris Perez.
Perez issued a two-out walk to Adam Dunn, but then got Gordon Beckham on a ground out to capture his 26th save.
The Indians did not take the lead for good until Kosuke Fukudome drove in Carlos Santana with a sixth-inning single. Cleveland added two in the seventh on an RBI base hit by Shin-Soo Choo and Asdrubal Cabrera's sacrifice fly.
Mark Buehrle (10-6) was charged with the loss, surrendering four runs on 12 hits in 7 1/3 innings. Buehrle had not given up more than three runs in any of his previous 18 starts, which left him tied with Frank Smith (1909) for the franchise record.
The White Sox had won their previous three games.