Sebastian Vettel finally scored the second victory of his latest Formula 1 title defence in the Singapore Grand Prix.
The Red Bull driver benefited from Lewis Hamilton's McLaren suffering a gearbox failure while holding a narrow lead.
Hamilton and Vettel ran in close company prior to the McLaren's problem, although the Briton seemed under control.
Third-placed Button fell away at first, before regaining some ground as he got better tyre longevity than those ahead.
Vettel made his first pitstop two laps earlier than Hamilton, and though this initially looked costly as he dropped into time-consuming traffic, once he was in clear air his pace on fresh rubber was sufficient to make up all the time lost and keep him between the McLarens.
That position became the race lead on lap 22, when Hamilton's car ground to a halt with a gearbox failure.
Button then kept Vettel honest to the finish, without it ever looking like the Red Bull's lead was in jeopardy. By the end, Vettel had edged away into a very secure lead.
Vettel stayed cool through two mid-race safety car periods: the first for Narain Karthikeyan sliding his HRT into the barrels at the tunnel entrance, and the second when Michael Schumacher ploughed into Jean-Eric Vergne on the restart lap.
Those cautions resolved the third-place battle. When Maldonado, who had fallen from second to fourth at the start, pitted for a second time under the first safety car, he rejoined 10th while Alonso stayed out and moved up to third. That decision probably secured the place for Ferrari even before Williams ordered Maldonado to retire with a hydraulic problem before the green.
Paul di Resta kept the frontrunners in sight throughout to score an excellent fourth for Force India, outpacing fifth-placed Mercedes man Nico Rosberg.
Lotus salvaged sixth and seventh with Kimi Raikkonen and Romain Grosjean on its least competitive weekend of 2012 so far.
Ferrari's Felipe Massa picked up a puncture on lap one, yet fought back impressively to secure eighth. On the way, he overtook Bruno Senna with an incredible move that saw him bounce off the Williams and the wall before arriving at Turn 13 sideways but in front.
The safety car timing hurt Mark Webber's strategy, and the best he could manage was to battle through to 10th, right on Daniel Ricciardo's tail.
Among other incidents, Nico Hulkenberg clashed with both Saubers on consecutive laps late on, with Sergio Perez the only one involved to get away without having to pit for repairs.
PROVISIONAL RACE RESULTS The Singapore Grand Prix Marina Bay Street Circuit, Singapore; 61 laps; 309.316km; Weather: Clear. Classified: Pos Driver Team Time 1. Vettel Red Bull-Renault 2h00:26.144 2. Button McLaren-Mercedes + 8.959 3. Alonso Ferrari + 15.227 4. Di Resta Force India-Mercedes + 19.063 5. Rosberg Mercedes + 34.784 6. Raikkonen Lotus-Renault + 35.759 7. Grosjean Lotus-Renault + 36.698 8. Massa Ferrari + 42.829 9. Ricciardo Toro Rosso-Ferrari + 45.820 10. Webber Red Bull-Renault + 47.175 11. Perez Sauber-Ferrari + 50.619 12. Glock Marussia-Cosworth + 1:31.918 13. Kobayashi Sauber-Ferrari + 1:37.141 14. Hulkenberg Force India-Mercedes + 1:39.413 15. Pic Marussia-Cosworth + 1:42.925 (*) 16. Kovalainen Caterham-Renault + 1:47.967 17. De la Rosa HRT-Cosworth + 1 lap 18. Senna Williams-Renault + 2 laps 19. Petrov Caterham-Renault + 2 laps Fastest lap: Hulkenberg, 1:51.033
(*) Pending 20-second penalty Not classified/retirements: Driver Team On lap Vergne Toro Rosso-Ferrari 38 Schumacher Mercedes 38 Maldonado Williams-Renault 36 Karthikeyan HRT-Cosworth 30 Hamilton McLaren-Mercedes 22 World Championship standings, round 14: Drivers: Constructors: 1. Alonso 194 1. Red Bull-Renault 298 2. Vettel 165 2. McLaren-Mercedes 261 3. Raikkonen 149 3. Ferrari 245 4. Hamilton 142 4. Lotus-Renault 231 5. Webber 133 5. Mercedes 136 6. Button 119 6. Sauber-Ferrari 100 7. Rosberg 93 7. Force India-Mercedes 75 8. Grosjean 82 8. Williams-Renault 54 9. Perez 65 9. Toro Rosso-Ferrari 14 10. Massa 51 11. Di Resta 44 12. Schumacher 43 13. Kobayashi 35 14. Hulkenberg 31 15. Maldonado 29 16. Senna 25 17. Vergne 8 18. Ricciardo 6 All timing unofficial