The defender side-footed home a cross from Benat to earn the visitors a surprise victory in Ukraine, though the hosts progressed to the last 16 thanks to BATE's loss to PortoMikel San Jose scored the only goal of the game as Athletic Bilbao picked up their first Champions League win by beating Shakhtar Donetsk 1-0 on Tuesday evening.
Shakhtar qualified for the round of 16 in Europe's premier club competition after Porto won 3-0 at BATE earlier on Tuesday.
But a poor home defeat against a Bilbao side that had collected just one point from their first four Group H matches means Shakhtar cannot finish first in the pool - regardless of what happens against leaders Porto next month.
Defender San Jose scored the game's only goal in the 68th minute, making the most of slack marking to flick Benat Etxebarria's free-kick into the roof of the net for Bilbao, who moved above BATE and into third.
Shakhtar were desperately unlucky not to win a late penalty, though, after Mikel Balenziaga clearly handled the ball to keep out a late shot.
The hosts were exceptionally sluggish throughout the contest in Lviv and wasted the few chances they created in front of goal.
Much of the pre-match attention surrounded Luiz Adriano, who was out to make Champions League history and be the first player to score 10 goals in the competition's group stages.
The Brazilian entered the match with nine - eight of which have come against BATE - but like his team-mates, he was frustrated by a stubborn Bilbao defence.
And Luiz Adriano will have no further chance to claim the record, after a second-half yellow card - for an arm across San Jose - saw him banned for the trip to Portugal, a match that captain Darijo Srna will also miss through suspension after a late booking.
Bilbao's pressing and excellent use of the offside trap kept Shakhtar at bay in the first half, but the hosts did have a great chance to take the lead in the seventh minute, only for Alex Teixeira to shoot at Gorka Iraizoz when sent through on goal by Fernando.
Bilbao - who rested top scorer Aritz Aduriz from the start - offered a reminder of their threat in the 25th minute when San Jose nodded just wide, while another Athletic defender, Xabier Etxeita, was forced off with injury and replaced by Carlos Gurpegui just after the half-hour mark.
Douglas Costa could only shoot wide after a storming run on the stroke of half-time and although the same man was on target after the break, Iraizoz was equal to the task.
Shakhtar turned the screw, ever so briefly, but Luiz Adriano and Taison both wasted good chances, the former half-volleying wide from close range.
The ineffectual Taison hit a tame effort at Iraizoz and Shakhtar's malaise was summed up perfectly by Costa's free-kick attempt in the 64th minute that sailed well over the goal.
Ernesto Valverde began to think his Bilbao side could produce an upset and introduced Aduriz for Markel Susaeta, and although that change did not bring about the opener, the visitors were soon celebrating.
Instead it was San Jose - who posed a threat at set-pieces throughout the match - who netted for Bilbao, as he, completely unmarked, produced a smart finish from Benat's set-piece.
Bilbao looked the more likely to score again, as another Benat free-kick went close, while Iker Muniain only just shot wide to end a neat move from the visitors.
But for Bilbao - who simply did the basics right - one goal was enough against a poor Shakhtar outfit, who were left to bemoan an oversight from the officials following Balenziaga's blatant handball.