Lucas Paqueta’s 35th minute strike was the difference in the re-run of the 2019 final, though Tite’s men were indebted to Ederson, who made a fine stop to maintain their lead late in the game.
The host nation started brightly at Rio’s Nilson Santos Stadium, where Gabriel Jesus was not involved as he served a one-match suspension following his sending off in the quarter-final victory over Chile.
Peru goalkeeper Pedro Gallese made a superb double save to deny Neymar and Richarlison before Paqueta made the breakthrough, slamming home Neymar’s cross from 12-yards after the Paris Saint-Germain forward beat three men with a brilliant run down the left.
Peru rallied after the break and, although they struggled to create chances from their long spells of possession, Ederson was at his best to keep out Gianluca Lapadula’s fierce drive.
The Manchester City goalkeeper has now kept six clean sheets in his last six games for the Selecao, including three in this year’s Copa America.
Brazil will face Argentina or Colombia in the final, though Jesus will not be involved due to his suspension.