Brazilian teenager Vinicius was clearly emotional after finding the net for the first time since February, though a deflection helped his effort beat Ruben Martinez in the 36th minute.
Luka Jovic had what would have been a maiden Madrid goal ruled out by VAR in the second half, but Rodrygo marked his first appearance since arriving from Santos in the close season by opening his account within two minutes of replacing Vinicius.
The victory should ease the pressure on Zinedine Zidane, but Saturday's clash with Atletico Madrid – one point behind Los Blancos in second – will be the real litmus test for the security of his position.
Zidane made eight changes to the team that beat Sevilla 1-0 at the weekend and Sergio Ramos, Casemiro and Toni Kroos were the only players retained.
14 - Vinícius Júnior attempted 14 dribbles against Osasuna, the most by a player in a LaLiga game this season and his best tally in a match for Real Madrid in all comps. Faith. pic.twitter.com/EKZQFHooqD— OptaJose (@OptaJose) September 25, 2019
Madrid took 18 minutes to come to life, with Alvaro Odriozola surging down the right and sending in a low cross that Ruben was fortunate to stop Raul Navas turning into his own net. The rebound fell kindly to Jovic, but the striker blazed over from six yards.
Kroos sent a blistering effort flashing past the post before Vinicius broke the deadlock when his shot from the edge of the box took a touch off Navas and sailed into the top-right corner, the Brazilian almost reduced to tears.
Jovic was unable to punish a defensive lapse from Osasuna within five minutes of the restart and he had a goal correctly disallowed for offside upon review before the hour mark.
Vinicius made way for 18-year-old Brazilian Rodrygo and in the 72nd minute he jinked in from the left, beat Lillo and curled a great finish into the bottom-right corner to consign Osasuna to their first defeat of the season.
1 - Rodrygo Goes is the fastest player to score his first LaLiga goal for Real Madrid (93 seconds) since Ronaldo Nazário in 2002 (62). Impact. pic.twitter.com/EknwWdo0oi— OptaJose (@OptaJose) September 25, 2019
What does it mean? Zidane keeps stars fresh
By resting his first choice attacking trio of Eden Hazard, Karim Benzema and Gareth Bale, Zidane will be feeling positive ahead of the trip to the Wanda Metropolitano.
Thibaut Courtois, Raphael Varane and Dani Carvajal were unused substitutes, while James Rodriguez only played eight minutes off the bench.
Rodrygo makes instant impact
Rodrygo was expected to split his time between the first team and Castilla this season, but Zidane may be keen to keep him around after a stellar cameo sealed victory for Madrid.
Jovic fails to step up
With Benzema having scored five goals in his past five LaLiga appearances, chances for Jovic to lead the Madrid attack are going to be limited for the foreseeable future. The Serbian was unable to take the chances that came his way and can expect a swift return to the bench.
Zidane's side meet Atletico in El Derbi on Saturday and Osasuna travel to Levante the following day.