Cosmin Olaroiu's side ended a three-match winless run in the league by scoring either side of the interval and now enjoy a four-point advantage at the summit.
Edgar Silva put through his own net with 12 minutes gone before Grafite spurned an opportunity to double Al Ahli's advantage from the penalty spot.
Luis Jimenez's third goal of the campaign wrapped up the result after the break, inflicting Al Shabab's first league defeat in six matches, and Edgar Silva's woe was compounded as he picked up a second booking in injury-time.
Al Shaab climbed off the foot of the table with only their second win of the season, defeating fellow strugglers Dubai 2-1 courtesy of a late comeback.
The hosts were starting at a ninth defeat in 11 games when Rami Yaslam put Dubai ahead, but Michael N'dri grabbed his sixth of the season to level the scores with seven minutes to play.
Just three minutes later, Thiago Quirino converted the winner, moving Al Shaab above their visitors and into 12th.
Asamoah Gyan continued his prolific form with the equaliser in Al Ain's 1-1 draw against Al Sharjah.
The home side made it five unbeaten in all competitions as Gyan increased his tally to 14 by cancelling out Yousif Saeed Juma's 11th-minute opener.
Also on Friday, Luiz Henrique struck in stoppage time to give Emirates a 2-1 victory over Al Wasl.
Al Jazira were in action in one of three matches on Thursday and claimed a 2-1 win against Bani Yas, with Ahmed Al Ghilani scoring twice.
Fellow top-four side Al Nasr prevailed by the same score against Ajman, who now sit bottom, while Hussain Fadhel's goal saw Al Wahda beat Al Dhafra 1-0.
Thank you for reading 5 articles this month* Join now for unlimited access
Enjoy your first month for just £1 / $1 / €1
*Read 5 free articles per month without a subscription
Join now for unlimited access
Try your first month for just £1 / $1 / €1
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.