South Africa had the upper hand chasing 166 for victory in their Group One super 10 match and needed 19 runs off the last two overs with five wickets in hand.
But Kulasekara gave away just four runs and picked up the wicket of Farhaan Behardien (five) to leave South Africa needing 15 runs off limited-overs specialist Malinga's final over.
Dale Steyn (zero) and the dangerous David Miller (19) were run out off the first two deliveries and although Imran Tahir (eight not out) managed a last-ball six, the chase had already gone out of South Africa's reach.
JP Duminy (39) top-scored for the Proteas, who ended on 160 for eight, and off-spinner Sachithra Senanayake was the most successful Sri Lankan bowler with figures of two for 22.
Opener Kusal Perera's assault gave Sri Lanka the tempo at the start of their innings and Angelo Mathews provided the late fireworks to lift them to 165 for seven after their captain Dinesh Chandimal had won the toss.
The diminutive Perera made clear his intentions with two fours and a six in three deliveries off Steyn's opening over and brought up his fifty off just 29 balls.
He made with 61 off 40 balls, including six fours and three sixes, before falling to leg-spinner Tahir, who stemmed the run flow and picked up three wickets for 26 runs.
Mathews was bowled by Steyn in the final over of the Sri Lanka innings but not before the test and 50-over captain had compiled 43 off 32 balls.
- Sports & Recreation
- South Africa
- Dale Steyn
- Imran Tahir