Both teams ended with 10 men after Laurent Koscielny and Olexandr Kucher were sent off in stoppage time.
But the damage had already been done as Roman Zozulya side-footed home after being put through by Edmar.
Koscielny then conceded a penalty for bringing down Zozulya, allowing Andriy Yarmolenko to convert from the spot.
The victory on home soil will give Ukraine, who have lost their previous three World Cup play-offs, confidence ahead of Tuesday's second leg in Paris.
Ukraine's advantage also leaves Didier Deschamps's men facing the prospect of failing to qualify for a major tournament for the first time since the 1994 World Cup.
Deschamps admitted before the match that his team faced a stern test in Kiev, with the hosts unbeaten in 10 games since Mikhail Fomenko became manager at the beginning of the year.
Ukraine have also become adept at keeping clean sheets, with this their eighth clean sheet during Fomenko's tenure.
With Franck Ribery closely marked, France barely troubled the Ukrainians, a volley from Samir Nasri after falling a goal behind the closest Les Bleus came to scoring.
Edmar was the architect of the first goal, bisecting the French defence, and Zozulya held firm under desperate French defending to squeeze the ball home from six yards.
Ukraine threatened to score a second and were rewarded with the penalty, while Yarmolenko converted. The evening got worse for Koscielny as he was shown a second yellow for raising his arms at Kucher.
A perfect evening for the hosts was ruined when Kucher was then shown a second yellow two minutes later for a foul on Mathieu Valbuena.
Deschamps said: "Opening the scoring gave them more strength and we made a mistake on the penalty.
"It's obviously a very bad result. We have to believe [we can go through] but Ukraine are the team in the best position to qualify. We still have 90 minutes at home."
France's hopes of qualifying for the 2014 World Cup in Brazil suffered a major blow as Ukraine won the first leg of their play-off tie.