It was a tale of two second-half penalties at the Riverside Stadium, where Boro's 10-match unbeaten run came to an end.
Middlesbrough had the first chance to take the lead from the spot early in the second half. But Marcus Tavernier's costly slip when taking it, leading to a double touch, meant the opener was ruled out.
That was the first goal conceded by Boro in 452 minutes of football and Pukki's calmness was enough to extend the Canaries' unbeaten run to eight games.
Middlesbrough had the best opening of the first half when Norwich struggled to cause any real problems for Marcus Bettinelli in the home goal.
The nearest Norwich came to scoring was early on when Emiliano Buendia curled an effort from 22 yards just wide of Bettinelli's right hand post.
Aside from those it tended to be Middlesbrough doing the early pressing, even though Norwich goalkeeper Tim Krul was hardly seriously tested either.
The only other real talking point of that half was when Johnson was lucky to escape punishment for kicking out at Buendia, as the two tussled off the ball. Neither was booked.
Referee Tony Harrington was in the thick of things soon after the break too when he pointed to the spot after Gibson tripped Tavernier.
But the Boro man's slip as he took the penalty resulted in the illegal double touch. Norwich were awarded a free-kick despite the ball ending in the net.
The Canaries looked more dangerous after that. Buendia went close a couple of times and substitute Pukki shaved the side-netting before Warnock introduced young wingers Coulson and Sam Folarin.
With 18 minutes left Coulson tripped Aarons in the area and Norwich had their chance from the spot. Pukki, unlike Tavernier, found the net without complication for his fifth goal of the season, sending Bettinelli the wrong way.
Neither goalkeeper was posed many questions after that and Norwich did the job to secure the points.