The Cavaliers led by 11 going into the final 2 minutes and fought off the Blue Devils to win at home for the 16th straight time.
Virginia has allowed the fourth lowest scoring average in the country this year and that defense came through again while limiting the Blue Devils to 39 percent shooting from the floor.
Harris, a 6-6 junior averaging 16 points a game, scored 36 against the Blue Devils. He hit 12-of-20 from the field and 10-of-12 from the foul line. Akil Mitchell added 19 points and 12 rebounds for Virginia (20-8, 10-5 Atlantic Coast Conference).
Virginia recorded a win over a team ranked in the top five for the first time in 11 seasons. Duke had defeated Virginia in each of their last eight meetings.
Conference leading Miami now sits three games in front of Duke with three to play, a fact that will take some of the luster off their meeting in Durham on Saturday.
Seth Curry scored 28 points to lead the Blue Devils (24-4, 11-4).
Virginia scored the game's first nine points and Duke could never fully recover. The Blue Devils closed within five at the break, but fell behind by as many as 16 in the second half.