They also lost first-choice goalkeeper, captain Ikechukwu Ezenwa, to injury after just 11 minutes.
They played the last half hour with only 10 men, after Ifeanyi Ifeanyi was dismissed following a nasty challenge.
Okechukwu Gabriel got the only goal of the game.
But Nigeria had to rely on some excellent saves from replacement keeper Oladele Ajiboye and some poor finishing from Sudan, who also had a man sent off late on.
Just five minutes after Ezenwa, who has also been first-choice keeper for the full national team, was forced off, Kalu Okugbue launched a long ball forward that was headed on by Anthony Okpotu into the path of Gabriel, who guided his shot home.
One of Ajiboye's first impressive saves came on the stroke of half-time as he dived to push a header on to the post, with the Sudanese claiming the ball had crossed the line. Replays showed it had not.
Thirteen minutes after the break Nigeria were reduced to 10 men as Ifeanyi slid in with both feet on his opposite number Mohamed Hashim Idris to get his second yellow card, which means he will miss Sunday's final.
Sudan created numerous chances to score an equaliser but poor finishing let them down as Ajiboye made good saves to deny Abdelrahman Maaz and Abdellatif Boya among others.
Sudan also ended the match with 10 players as Bakri Bashir was shown a straight red card as the referee adjudged he pulled Dayo Ojo just outside the area to deny him a clear goalscoring opportunity.
The Sudanese were then denied twice in injury time as Ajiboye made another good save, then he and a defender managed to scramble the ball off the line.
Awaiting Nigeria in Sunday's final are the hosts Morocco, who earlier needed extra time to beat Libya 3-1.
The last action at the tournament for Sudan will be the third-placed play-off against Libya on Saturday in Marrakech.