Joe Harris and Virginia caught Duke looking ahead, as the Cavaliers knocked off the third-ranked Blue Devils, 73-68, to extend their winning streak at John Paul Jones Arena to 16 games.
Harris scored a career-high 36 points while Akil Mitchell logged 19 points and 12 rebounds for Virginia (20-8, 10-5 ACC), which earned its first win over a top-5 opponent in exactly 11 years and ended an eight-game skid against the Blue Devils.
The loss drops Duke (24-4, 11-4) three games behind ACC-leading Miami-Florida with three to play, meaning their anticipated showdown on Saturday in Durham has lost some of its suspense.
Duke had won eight of nine coming in but struggled against the nation's fourth-ranked scoring defense and got outrebounded 36-25.
Seth Curry had 28 points and Mason Plumlee was held to 10 in the loss.