Ulster stumbled to a third consecutive Pro 12 defeat as Treviso became the first Italian side to win at Ravenhill.
Treviso, winning three games in a row for the first time at this level, were 20-0 up well into the second half.
They got a penalty try just before half-time and playmaker Kris Burton ran through for a try in the 59th minute.
Ulster threatened a comeback when South African flanker Pedrie Wannenburg plundered two tries in five minutes but Treviso claimed their historic victory.
It was Ulster's first defeat at their Belfast headquarters since going down to Leinster last December.
The result is also a blow to their Pro 12 aspirations which had looked so promising after the campaign began with three victories.
Burton opened the visitors' account with a sixth-minute penalty and, after Jared Payne was helped from the field with what looked like an ankle injury, the home side were second best for the rest of the half.
A superb run by winger Brendan Williams ended with him being hauled down just short of the line.
That led to a series of scrums on Ulster's line which, after Italian referee Stefano Penne had sin-binned prop Declan Fitzpatrick for not binding, led to a penalty try in the 41st minute, which Burton converted.
Burton made no mistake with his second penalty just before the hour mark after Ulster had pulled down an advancing Treviso maul.
It got worse for the home side as replacement full-back Adam D'Arcy's kick through landed in the arms of Burton who ran in from just over halfway.
Burton's conversion gave his side a 20-0 lead after just over an hour.
Ulster needed a quick response and almost their first decent attack of the game saw Wannenburg put over at close-range from a Paul Marshall pass.
Humphreys converted to reduce the deficit to 13 points with just over 15 minutes on the clock.
Wannenburg crossed the line again on 73 minutes from a line-out, but Humphreys could not land the extras and Ulster remained eight points adrift and outside bonus point range.
Burton then finished the scoring with an injury-time penalty.
Ulster: Payne, Gilroy, Cave, Spence, Whitten, Humphreys, P Marshall, Fitzpatrick, Kyriacou, Cronin, Barker, Tuohy, Wannenburg, McComish, Henry.
Replacements: D'Arcy for Payne (15), Jackson for Whitten (41), Diack for Kyriacou (65), Stevenson for Barker (54), Brady for McComish (68).
Not used: McCall, Macklin, Porter.
Benetton Treviso: Nitoglia, Iannone, Galon, Morisi, Williams, Burton, Botes, Rizzo, Ceccato, Cittadini, A Pavanello, Bernabo, Minto, Vermaak, Filippucci.
Replacements: Sgarbi for Morisi (17), Muccignat for Rizzo (65), Vidal for Ceccato (52), Padro for Bernabo (65), Vosawai for Filippucci (52).
Not used: Fazzari, de Waal, Chillon.
Referee: Stefano Penne (Italy).